java线程的三种实现方式
线程实现的三种种方式:
一个是继承Thread类,实现run()方法;
一个是实现Runnable接口,实现run()方法;
一个是实现Callable接口,实现call()方法;该方式和实现Runnable接口的区别在于,call()方法允许申明抛出异常,而且允许带返回值。 该方式在jdk1.5以后提供
继承Thread和 实现runnable接口 生成的线程在共享线程类的实例属性上不同,前者不能共享实例属性,后者可以, 因为后者创建的runnable对象仅仅是线程的target 而多个线程可以共享同一个target(好处在于,非常适合多个相同线程来处理同一份资源的情况)。
测试代码1如下:
public class FirstThread extends Thread {
private int i;
public void run(){
for(; i<100; i++){
//当线程继承Thread类时候,直接使用this即可获取当前线程
//Thread对象的getName()返回当前线程的名字
//因此可以直接调用getName()方法,返回当前线程的名字
System.out.println(this.getName()+"---- "+ i);
}
}
public static void main(String [] args){
for(int i = 0; i<100; i++){
//调用Thread的currentThread()方法获取当前线程
System.out.println( Thread.currentThread().getName() + " "+ i);
if(i==20){
new FirstThread().start();
new FirstThread().start();
}
}
}
}
上面的结果中输出的i不是连续的、而且有重复,结果如下:
Thread-1---- 8
Thread-1---- 9
Thread-0---- 5
Thread-0---- 6
Thread-0---- 7
Thread-0---- 8
Thread-0---- 9
Thread-0---- 10
说明:它们没有共享线程中的实例属性i,因为继承Threa每次创建的线程对象都需要创建一个FirstThread对象,所以Thread-0 和Thread-1 不能共享实例属性;
测试代码2:
public class SecondThread implements Runnable{
private int i;
public void run(){
//
for(;i<100;i++){
System.out.println(Thread.currentThread().getName()+"---- "+ i );
}
}
public static void main(String [] args){
for(int i =0; i<100; i++){
System.out.println(Thread.currentThread().getName()+"----- "+i);
if(i == 20){
SecondThread s = new SecondThread();
new Thread(s,"新线程1").start();
new Thread(s,"新线程2").start();
}
}
}
}
上面结果中,部分结果如下:
main----- 24
新线程2---- 10
新线程1---- 9
新线程2---- 11
main----- 25
新线程2---- 13
新线程1---- 12
新线程2---- 14
说明:新线程1和新线程2的输出i的值是连续的,而且不重复,说明采用Runnable接口的方式创建的多个线程可以共享线程类的实例属性,这种方式下创建的Runnab对象只是线程的target,而多个线程可以共享同一个target,也就是可以共享同一个target的实例属性。
另外注意:同一个线程不能调用两次或者多次start()方法,会报告异常!!
最新文章
- Entity Framework 6 Recipes 2nd Edition(9-2)译->;用WCF更新单独分离的实体
- Git和Code Review流程
- [No000092]SVN学习笔记3-Import/Checkout(迁入/迁出),GetLock(加锁)
- html传值 location.search取
- Ubuntu下Apache+SVN+submin实现WEB管理SVN
- KnockoutJS---一个极其优秀的MVVM模型的js框架
- POJ 1681---Painter&#39;s Problem(高斯消元)
- 关于 xib 的使用
- 数据结构Java实现03----单向链表的插入和删除
- [译]C#控制管理VisualSVN Server
- CDH hive的安装
- ok6410的DMA裸机总结
- eclipse不自动弹出提示(Alt+/ 快捷键失效)
- 使用minidom来处理XML的示例(Python 学习)(转载)
- javascript语句语义大全(7)
- Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案
- 学JAVA第十天,一维数组及二维数组的使用。
- Vue.js——60分钟快速入门(转载)
- PLSQL远程连接数据库(亲测可试)
- 用归并排序或树状数组求逆序对数量 poj2299