java线程的初始化

第一种线程的初始化

	//第一种 线程的初始化
		Thread a = new Thread(){
			 public void run() {//此方法为子类覆盖Thread父类的run方法
				 while(true){
					 System.out.println("1:"+Thread.currentThread().getName());
				 }
			 }
		};
		a.start();

第二种线程的初始化

//第二种线程的初始化
		Thread b = new Thread(new Runnable() {
			
     //此方法为子类覆盖父类的public Thread(Runnable target)中的target.run()方法
			@Override
			 public void run() {
       
				 while(true){
					 System.out.println("2:"+Thread.currentThread().getName());
				 }
			 }
		});
		b.start();

两种方式的区别

  第一种是重写了Thread类的run方法(在jdk下的java.lang.Thread的run方法如下)

  @Override
    public void run() {
        if (target != null) {//此处的target为Thread(Runnable target)里面的target
            target.run();
        }
    }

也就是说第一种是覆盖了上面的run方法

第二种是实现了java.lang.Runnable并且重写了java.lang.Runnable下的run方法(也就是上图的target.run())。

深入理解

  一般来说调用Thread的start()方法会先看是否重写了Thread的run方法

     重写则调用其子类的run方法

    未被重写则调用其父类的run方法即执行重写了java.lang.Runnable下的run方法

看如下问题

//会执行那段代码????
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				 while(true){
					 System.out.println("3:"+Thread.currentThread().getName());
				 }	
			}
		}){
			 public void run() {//此方法为子类覆盖父类的run方法
				 while(true){
					 System.out.println("4:"+Thread.currentThread().getName());
				 }
			 }
		}.start();

答案是会执行下面一个run方法。因为匿名Thread类重写了父类的run方法则会执行第二个run方法语句。

若想执行第一个run方法则只需将第二个run方法的去掉即可。

猜你喜欢

转载自blog.csdn.net/qq_35654259/article/details/81304293