java多线程操作
进程是程序的一次动态的执行过程,它经历了从代码加载、执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
多线程是实现并发机制的一种有效的手段。进程和线程一样,都是实现并发的一个基本单位。
如果现在同时运行多个任务,则所有的系统资源将是共享的,补所有线程所公用,但是程序处理需要CPU,传统的单核CPU来说 ,在同一个时间段上会有多个程序执行,但是在同一个时间点上只能存在一个程序运行,也就是说,所有的程序都要抢占CPU资源。
但是现在的CPU已经发展到多核状态了,在一个电脑上可能会存在多个CPU,那么这个时候就可以非常清楚的发现多线程操作间是如何并发执行的,那么本机的CPU是双核的。
JAVA的多线程实现
两种方式实现多线程:
1)继承Thread类
2)实现Runnable接口
继承Thread类
Thread类是在java.lang包中定义的,一个类只要继承了Thread类,此类就称为多线程操作类。在Thread子类之中,必须明确的复写Thread类中的run()方法,此方法为线程的主体。
class 类名称 extends Thread{
属性...;
方法...;
//复写Thread类中的run()方法,此方法为线程主体
public void run(){
线程主体;
}
}
java.lang 包含在程序运行时自动导入,所以无需手工编写import语句。
一个类继承了Thread类之后,那么此类就具备了多线程的操作功能。
class Mythread1 extends Thread{
private String name;
public Mythread1(String name){
this.name=name;
}
public void run(){
for(int i=0; i<10;i++){
System.out.println(name + "运行,i="+i);
}
}
}
启动线程必须使用Thread类中定义的start()方法,一旦调用start()方法,实际最终调用的是run()方法。
class Mythread1 extends Thread{
private String name;
public Mythread1(String name){
this.name=name;
}
public void run(){
for(int i=0; i<10;i++){
System.out.println(name + "运行,i="+i);
}
}
}
public class Mythread {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Mythread1 mt1=new Mythread1("线程A");
Mythread1 mt2=new Mythread1("线程B");
mt1.start();
mt2.start();
}
}

同一个对象多次调用start()方法,会抛出:IllegalThreadStateException - 如果线程已经启动。
实现Runnable接口
class Mythread1 implements Runnable {
private String name;
public Mythread1(String name){
this.name=name;
}
public void run(){
for(int i=0; i<10;i++){
System.out.println(name + "运行,i="+i);
}
}
}
public class MyThread {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Mythread1 mt1=new Mythread1("线程A");
new Thread(mt1).start();
}
}
两种实现方式的区别
对于Thread类和Runnable接口本身都是可以进行多线程的实现,那么两都到底使用区别。
1)继承局限:使用Runnable接口可以避免单继承的局限,而Thread类有此局限。
2)资源共享:使用Runnable接口可以实现多线程资源的共享,而Thread类却无法实现。
Thread 类定义 :public class Thread extends Object implements Runnable
发现Thread类实际上是Runnable的子类。而且Thread类也要去接收Runnable其他子类对象,而且所有的线程中,通过Runnable接口实现的线程类里面都是编写的具体功能,而并没有所谓的CPU调度,而真正意义的CPU调度由操作系统完成(通过Thread类的start()方法调用的)。
Thread类要去协调操作系统,并且最终还要执行具体的纯种主体的方法,而线程的主体呢,现在只专著于具体的功能实现,至于如何调度根本不管。
java多线程操作的更多相关文章
- Java多线程操作同一个对象,线程不安全
Java多线程操作同一个对象 发现问题:多个线程操作同一资源的情况下,线程不安全,数据紊乱 代码: package multithreading; // Java多线程操作同一个对象 // 买火车票的 ...
- java 多线程操作List,已经做了同步synchronized,还会有ConcurrentModificationException,知道为什么吗?
如题,最近项目里有个模块我做了异步处理方面的事情,在code过程中发现一个颠覆我对synchronized这个关键字和用法的地方,请问各位java开发者们是否对此有一个合理的解释,不多说,我直接贴出问 ...
- 【转】Java多线程操作局部变量与全局变量
原文网址:http://blog.csdn.net/undoner/article/details/12849661 在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控 ...
- Java多线程操作局部变量与全局变量
在这篇文章里,我们首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很 ...
- Java多线程操作同一份资源
现在两个线程,可以操作初始值为零的一个变量,实现一个线程对该变量加1,一个线程对该变量减1,实现交替,来10轮,变量初始值为零. package com.yangyuanyuan.juc1205; i ...
- java 多线程操作(锁)
1.对象的加锁及其操作 程序中单独的并发线程对同一对象进行操作的代码段,成为临界区.java语言中的临界区可以是一个语句块 或者方法,使用关键字synchronized进行标识. 对象锁:java平台 ...
- java 多线程12 : 无锁 实现CAS原子性操作----原子类
由于java 多线程11:volatile关键字该文讲道可以使用不带锁的情况也就是无锁使变量变成可见,这里就理解下如何在无锁的情况对线程变量进行CAS原子性及可见性操作 我们知道,在并发的环境下,要实 ...
- Java多线程对同一个对象进行操作
示例: 三个窗口同时出售20张票. 程序分析: 1.票数要使用一个静态的值. 2.为保证不会出现卖出同一张票,要使用同步锁. 3.设计思路:创建一个站台类Station,继承THread,重写run方 ...
- java多线程的操作
上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容.这篇文章接着介绍Java的多线程.主要从一下几方面介绍. 1 线程类的常用方法 1.1 start() ...
随机推荐
- [转]Asp.Net 用户验证(自定义IPrincipal和IIdentity)
本文转自:http://www.cnblogs.com/amylis_chen/archive/2012/08/02/2620129.html Default.aspx 页面预览 默认情况下SignI ...
- [LeetCode] Count Univalue Subtrees 计数相同值子树的个数
Given a binary tree, count the number of uni-value subtrees. A Uni-value subtree means all nodes of ...
- [LeetCode] Construct Binary Tree from Inorder and Postorder Traversal 由中序和后序遍历建立二叉树
Given inorder and postorder traversal of a tree, construct the binary tree. Note: You may assume tha ...
- 《Markdown 一些基本语法》
Markdown编辑器是在上学期学习Java时写博客用来编辑文字内容以及形式的,但其实当时掌握Markdown的语法却是极少的,也仅仅是会使用几级标题这样简单的语法,就和当时学习git上传代码一样,也 ...
- Jquery学习笔记 --ajax删除用户,使用了js原生ajax
主要复习了php的pdo数据库操作,和js的ajax,真麻烦,希望jquery的ajax简单点. index.php: 1 <!DOCTYPE html> 2 <html lang= ...
- 创建ejs模板的express工程
npm install -g express npm install -g express-generator express -e projectName cd projectName npm in ...
- 【BZOJ 4579】【Usaco2016 Open】Closing the Farm
http://www.lydsy.com/JudgeOnline/problem.php?id=4579 把时间倒过来,只是加点,并查集维护连通块. #include<cstdio> #i ...
- CSS你可能还不知道的一些知识点
一.特殊选择器 1.* 用于匹配任何的标记 2.> 用于指定父子节点关系 3.E + F 毗邻元素选择器,匹配所有紧随E元素之后的同级元素F 4.E ~ F 匹配所有E元素之后的同级元素F 5. ...
- CSS选 择器 三种样式
一.CSS三种样式 代码 宽度 高度 实线 颜色 A内联样式是优先级最高的方式 px必须写 A:内联式 弊端:代码多很乱 <body> <div class="divc ...
- MYSQL批量修改表前缀与表名sql语句
修改表名 ALTER TABLE 原表名 RENAME TO 新表名; 一句SQL语句只能修改一张表 show tables; 1. SELECT CONCAT( 'ALTER TABLE ', ta ...