现在的位置: 首页 > 综合 > 正文

创建线程的两种方式

2018年01月18日 ⁄ 综合 ⁄ 共 2468字 ⁄ 字号 评论关闭

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();
   
   }
   
}

抱歉!评论已关闭.