线程控制

线程控制

理解了线程生命周期的基础上,可以利用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());
       }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值