java中start()、yield、setDeamon()

本节主要说明以下三个问题

  1. start()的启动顺序不代表线程的启动顺序
  2. yeild的作用
  3. 守护线程

1、start()与线程启动顺序

package foreverly.cn.chapter1;

public class MyThread extends Thread {
    private int number;
    public MyThread(int num) {
        super();
        number = num;
    }
    @Override
    public void run( ) {
        super.run();
        System.out.println("Mythread---"+number+"start");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Mythread---"+number+"end");
    }

}
package foreverly.cn.chapter1;

public class TestMain {
   public static void main(String[] args) {
      MyThread mythread1 = new MyThread(1);
      MyThread mythread2 = new MyThread(2);
      MyThread mythread3 = new MyThread(3);
      MyThread mythread4 = new MyThread(4);
      MyThread mythread5= new MyThread(5);
      
      
      mythread1.start();
      mythread2.start();
      mythread3.start();
      mythread4.start();
      mythread5.start();
      System.out.println(Thread.currentThread().getName());
   }

}

输出结果:

main
Mythread---5start
Mythread---3start
main
Mythread---4start
Mythread---1start
Mythread---2start
Mythread---5end
Mythread---4end
Mythread---3end
Mythread---2end
Mythread---1end

在main方法中,设置了start的顺序为1、2、3、4、5,但线程的启动顺序与之无关。

容易产生的误解是main线程是第一个线程。由输出看出,main也并不”特殊“。

2、 yield作用

yield()方法的作用是让线程放弃当前的CPU资源,但这并不意味着会切换为其他线程。让出的时间不确定有多长,有可能刚让出又立马获得。

package foreverly.cn.chapter1;

public class YieldThread extends Thread{
    @Override
    public void run() {
        long beginTime = System.currentTimeMillis();
        int count = 0;
        for (int i = 0; i < 5000; i++) {
//            Thread.yield();
            count += i;
        }
        long endTime = System.currentTimeMillis();
        System.out.println("用时:"+(endTime-beginTime)+"毫秒");
    }
}
package foreverly.cn.chapter1;

public class YieldTest {
    public static void main(String[] args) {
        Thread thread = new YieldThread();
        thread.start();
    }
}

有注释的情况(即不用yield):

用时:1毫秒

取消注释

用时:21毫秒

3、守护线程

守护线程是一种特殊的线程,通过setDaemon(true)可将线程设置为守护线程。

守护线程含有陪伴的意义。如果没有了非守护线程,守护线程就会自动销毁(无论执行到哪里)。GC(垃圾回收)就是一种典型的守护线程。

posted @ 2019-06-01 19:09  落音  阅读(351)  评论(0编辑  收藏  举报