今天我们接着学习线程调度相关的内容:sleep(休眠),休眠:是指线程进入阻塞状态 ,主动让出cpu给其他线程,便于轮换执行,时间到了之后线程进入就绪状态,获取Cpu 执行。
线程休眠的方法是Thread.sleep(long millis) 和Thread.sleep(long millis, int nanos) ,均为静态方法,简单的说:谁调用sleep方法就是谁把cpu让出来,谁进入休眠,谁停止运行。
package javaThread;
public class SleepThread {
public static void main(String[] args) {
ThreadSleep t1 = new ThreadSleep(" t1 ");
ThreadSleep t2 = new ThreadSleep(" t2 ");
t1.start();
t2.start();
}
private static class ThreadSleep extends Thread {
private String mName;
public ThreadSleep(String name ) {
mName = name;
}
@Override
public void run() {
super.run();
for(int i = 0; i< 10;i++) {
System.out.println(" name " + mName + " i " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
输出:
name t2 i 0
name t1 i 0
name t1 i 1
name t2 i 1
name t2 i 2
name t1 i 2
name t2 i 3
name t1 i 3
name t2 i 4
..................
线程让步(yield):和sleep差不多的,都是主动让出Cpu给其他线程执行,但也有不同的地方,sleep只是让出一些时间,时间到了又开始获取cpu,而yield则是仅仅让出cpu,线程又从新进入可执行状态。
package javaThread;
public class YiledThread {
public static void main(String[] args) {
ThreadYield t1 = new ThreadYield(" t1 ", true);
ThreadYield t2 = new ThreadYield(" t2 ", false);
t1.start();
t2.start();
}
private static class ThreadYield extends Thread {
private String mName;
private boolean mYelid;
public ThreadYield(String name ,boolean yield) {
mName = name;
mYelid = yield;
}
@Override
public void run() {
super.run();
if(mYelid) {
Thread.yield();
}
for(int i = 0; i< 10;i++) {
System.out.println(" name " + mName + " i " + i);
}
}
}
}
输出:
name t2 i 0
name t1 i 0
name t2 i 1
name t1 i 1
name t2 i 2
name t1 i 2
name t2 i 3
name t1 i 3
name t1 i 4
name t1 i 5
name t1 i 6
name t1 i 7
name t1 i 8
name t1 i 9
name t2 i 4
name t2 i 5
name t2 i 6
name t2 i 7
name t2 i 8
name t2 i 9