java中start()、yield、setDeamon()
本节主要说明以下三个问题
- start()的启动顺序不代表线程的启动顺序
- yeild的作用
- 守护线程
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(垃圾回收)就是一种典型的守护线程。
似乎上了贼船,偏偏又心甘情愿。