创建线程的两种方式

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值