线程控制
理解了线程生命周期的基础上,可以利用Java提供的线程控制命令对线程的生命周期进行干预。
- join()
阻塞指定线程等到另一个线程完成以后再继续执行。 - sleep()
使线程停止运行一段时间,让出CPU,将处于阻塞状态,如果调用了sleep方法之后,没有其他等待执行的线程,这个时候当前线程不会马上恢复执行!
实际开发中经常使用Thread.sleep()来模拟线程切换,暴露线程安全问题。 - yield ()
让当前正在执行线程暂停,不是阻塞线程,而是将线程转入就绪状态。如果调用了yield方法之后,没有其他等待执行的线程,这个时候当前线程就会马上恢复执行! - setDaemon()
可以将指定的线程设置成后台线程。
创建后台线程的线程结束时,后台线程也随之消亡。
只能在线程启动之前把它设为后台线程。 - interrupt()
并没有直接中断线程,而是需要被中断线程自己处理。 - stop()
结束线程,不推荐使用。
【示例4】使用join()阻塞当前线程
public class Test {
public static void main(String[] args) {
int i = 0;
while (i <= 200) {
if (i == 20) {
Thread thread1 = new TortoiseThread();
thread1.setName("程咬金");
thread1.start();
try {
// 线程A正在执行 线程B进来,线程B执行完,A才会执行。
//A此间处于阻塞状态
thread1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("兔子领先了,add oil ...." + i + " " +
Thread.currentThread().getName() + " " +
Thread.currentThread().getPriority());
i++;
}
}
}
【示例5】使用sleep()让线程休眠
public class TortoiseThread extends Thread {
@Override
public void run() {
while(true){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("乌龟领先了,加油...."+this.getName()
+" "+this.getPriority());
}
}
}
public class Test {
public static void main(String[] args) {
Thread thread1 = new TortoiseThread();
thread1.start();
while(true){
try {
Thread.sleep(1);//让出CPU,进入阻塞状态,阻塞时间到,退出阻塞,进入就绪。
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("兔子领先了,add oil ...."+
Thread.currentThread().getName()+" "+
Thread.currentThread().getPriority());
}
}
}
【示例6】使用setDaemon()设置守护线程
public class Test {
public static void main(String[] args) {
Thread thread1 = new TortoiseThread();
thread1.setDaemon(true);//后台线程 守护线程 寄生线程
thread1.start();
int i =0;
while(i<=200){
System.out.println("兔子领先了,add oil ...."+i+" "+
Thread.currentThread().getName()+" "+
Thread.currentThread().getPriority());
i++;
}
}
}
【示例8】中断线程
public class Test {
public static void main(String[] args) {
Thread thread1 = new TortoiseThread();
thread1.start();
int i =0;
while(i<=200){
System.out.println("兔子领先了,add oil ...."+i+" "+
Thread.currentThread().getName()+" "+
Thread.currentThread().getPriority());
i++;
}
//thread1.stop();//不推荐 相当于直接关机
thread1.interrupt();//中断,并不是结束了线程,只是修改了一下线程的状态,还需要线程本身检查状态的变化。
}
}
public class TortoiseThread extends Thread {
private int num = 100;
public void run() {
while(!isInterrupted()){//true false 线程本身检查状态是否发生变化
System.out.println("乌龟领先了,加油.... "
+this.getName()+" "+this.getPriority());
}
}
}