IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结!
创建线程有两种方式:
(1)创建Thread的子类,重写run()方法
(2)创建Thread对象,传递一个Runnable实现类的对象
注意:
如果在Thread子类覆盖的run方法中编写了运行代码,也为Thread子类对象传递了一个Runnable对象,那么,线程运行时的执行代码为子类中的run()方法
Thread.class类的源代码
package java.lang; public class Thread implements Runnable { /* What will be run. */ private Runnable target; private void init(ThreadGroup g, Runnable target, String name, long stackSize) { ........//some code this.target = target; ........//some code } public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0); } public Thread(ThreadGroup group, Runnable target) { init(group, target, "Thread-" + nextThreadNum(), 0); } public Thread(String name) { init(null, null, name, 0); } public Thread(ThreadGroup group, String name) { init(group, null, name, 0); } public Thread(Runnable target, String name) { init(null, target, name, 0); } public Thread(ThreadGroup group, Runnable target, String name) { init(group, target, name, 0); } public Thread(ThreadGroup group, Runnable target, String name, long stackSize) { init(group, target, name, stackSize); } public void run() { if (target != null) { target.run(); } } }
例子程序:
package edu.review; public class TraditionalThread { public static void main(String[] args) { ////第一种创建线程对象方式 Thread t1 = new Thread("线程1"){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); System.out.println(this.getName());//这里的this指的是Thread的匿名子类 } } }; t1.start(); //第二种创建线程对象方式 Thread t2 = new Thread(new Runnable(){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); //System.out.println(this.getName());//这里的this不是Thread对象,所以没有getName()方法 } }},"线程2"); t2.start(); //两种方式综合比较 /** * 结果:程序 将执行Thread子类中的run()方法而不会执行Runnable接口的run()方法 * 原因:因为Thread中的run()方法: * public void run() { if (target != null) { target.run(); } } * 所以当Thread子类重写其run()方法后,Thread中run()方法中的调用target.run()的代码就不会生效,所以Runnable的run()方法不会被执行 **/ Thread t3 = new Thread(new Runnable() { @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Runnable接口:"+Thread.currentThread().getName()); } } }){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Thread子类:"+Thread.currentThread().getName());//输出 } } }; t3.start(); } }