Java

java并发之线程协作

2019-03-29  本文已影响4人  安仔夏天勤奋

在多线程开发中,常常在线程间进行切换或调度,那么就会出现线程协作。线程协作有几种方式如下:

  1. 阻塞/唤醒
  2. 让步
  3. 取消(中断)

先上一个简图吧

阻塞/唤醒

让步 join()/yield()

取消(中断)

每个线程都有一个标志位,标志当前线程是否中断,Thread类中有获取当前线程中断状态及设置当前线程为中断状态的方法:

 /**
   * @Author 安仔夏天勤奋
   * Create Date is  2019/3/29
   */
public class TestInterrupt{
  public class InterruptRunnableDemo extends Thread {
    @Override
    //这种设计比较好,当调用阻塞操作时,会因为抛出异常退出,当不调用阻塞操作时,会因为检查中断状态而退出
    public void run(){
        try{
            while(!Thread.interrupted()){
               // 循环代码              
            }
            System.out.println("Exit normal");
        }catch(Exception e){
            System.out.println("interrupted");
        }
    }
  public static void main(String[] args) throws InterruptedException {
            Thread thread = new InterruptRunnableDemo();
            thread.start();
            Thread.sleep(1000);
            thread.interrupt();
  }
}

注意

  1. 如果线程因wait/sleep/join方法进入等待阻塞,或因调用Lock对象的lockInterrupity/tryLock(time)进入同步阻塞状态,其他线程中调用interrupt方法会导致阻塞线程中抛出InterruptException异常;
  2. 阻塞状态的线程抛出InterruptException时会重置中断标志(标志位false);
  3. 类方法interrupted获取中断状态后会清除中断状态,实例方法isInterrupted()只是获取中断状态;
  4. 除使用interrupt方法中断线程外,还有2种方式中止线程执行,a. 退出标志使线程正常退出(线程通信);b.使用stop()方法强行终止线程(不推荐,可能发生不可预料的结果)
上一篇下一篇

猜你喜欢

热点阅读