多线程_Thread类简介及创建线程的两种方式

来源:互联网 发布:七灯军团戒指淘宝 编辑:程序博客网 时间:2024/05/21 07:44


   一、Thread类简介

     1、 创建线程,即创建Thread类或者Thread子类的实例jvm就会调用这个实例的run方法,而我们要实现的功能也就写在这run方法里面。Thread类中简略的源码是:

    

public void run() {          if (target !=null){          target.run();          }    }   private Runnable target;   public Thread(Runnable target) {            init(null, target, "Thread-" + nextThreadNum(), 0);           }           private void init(ThreadGroup g, Runnable target, String name, long stackSize) {               .......              this.target = target;              ....           }

2、从代码可以看出:

  当Thread类实例被调用run方法时,首先判断该实例的Runnable字段target

  是否存在,如果存在,就调用targetrun方法,否则run方法结束。从这里面,我发现有两个地方可以放我们的需求代码,一个是Thread类的run方法里面,另一个是target字段的run方法里面。从这里,也就形成了两种创建线程的方式了。

二、两种创建线程的方式;

1、创建Thread子类对象,覆盖run方法:当jvm调用该对象的run方法是,即调用了我们的需求代码。  

示例:

 

Thread thread= new Thread() {@Overridepublic void run() {            //这里写我们的需求代码,覆盖Thread类的run方法}};


2、通过Runnable实例构造Thread象:当Thread对象run方法被调用时,会再调用Runnablerun方法里面的代码。

  示例:

    Thread thread2 = new Thread(new Runnable() {@Overridepublic void run() {//这里写我们的需求代码,实现Runnable接口run方法}});


3、总结:

  1)不管代码形式怎么样,都是基于①覆盖Threadrun方法或者②用Runnable实例构造Thread对象。要说原因,就Thread类的这几句代码

 public void run() {          if (target !=null){          target.run();          }    }


导致有这两种写线程的方法。

2)推荐使用的是通过Runnable实例构造线程。因为这种方式可以分离线程和我们的需求代码Thread用来封装线程相关信息,而Runnable实例则可以封装我们的需求代码,然后再将Runnable实例传给Thread,让之替我们运行。如果非要说出什么大道理来,那么前者是继承,而后者是组合

3)因为Thread类实现了Runnable接口,所以在以Runnable实例构造Thread时,用Thread子类实例也可以,不过就有点多此一举了,本来只需要传一个run方法进来,你却非要传更多额外的东西,这不浪费了?

   3)要想了解Thread类的更多功能,还是需要多看Thread类源码。


原创粉丝点击