线程实现的三种种方式:

一个是继承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()方法,会报告异常!!

最新文章

  1. Entity Framework 6 Recipes 2nd Edition(9-2)译-&gt;用WCF更新单独分离的实体
  2. Git和Code Review流程
  3. [No000092]SVN学习笔记3-Import/Checkout(迁入/迁出),GetLock(加锁)
  4. html传值 location.search取
  5. Ubuntu下Apache+SVN+submin实现WEB管理SVN
  6. KnockoutJS---一个极其优秀的MVVM模型的js框架
  7. POJ 1681---Painter&#39;s Problem(高斯消元)
  8. 关于 xib 的使用
  9. 数据结构Java实现03----单向链表的插入和删除
  10. [译]C#控制管理VisualSVN Server
  11. CDH hive的安装
  12. ok6410的DMA裸机总结
  13. eclipse不自动弹出提示(Alt+/ 快捷键失效)
  14. 使用minidom来处理XML的示例(Python 学习)(转载)
  15. javascript语句语义大全(7)
  16. Apache shiro集群实现 (五)分布式集群系统下的高可用session解决方案
  17. 学JAVA第十天,一维数组及二维数组的使用。
  18. Vue.js——60分钟快速入门(转载)
  19. PLSQL远程连接数据库(亲测可试)
  20. 用归并排序或树状数组求逆序对数量 poj2299

热门文章

  1. 2017-02-20 可编辑div中如何在光标位置添加内容
  2. 解决:Python爬取https站点时SNIMissingWarning和InsecurePlatformWarning
  3. java基础篇 -- 常用的日期加减和日期格式化工具类
  4. 51nod 1131 数列
  5. codewar代码练习2——7级晋升6级
  6. WordPress发布文章前强制要求上传特色图像
  7. 程序员转项目管理之考证PMP
  8. Linux下markdown编辑软件 — retext 支持实时预览,存为pdf、html、ODT等
  9. Nexus安装以及2,3比较
  10. 洛谷【P1004】方格取数