【java并发编程实战】第七章:取消与关闭

停止线程的几种方式

一般的逻辑停止
public class ThreadInterruptTest {

    public static volatile boolean cancel = true;

    public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread(
                new Runnable() {
                    @Override
                    public void run() {

                        while (cancel) {
                            System.out.println("still alive");
                        }


                    }

                }
        );

        thread.start();

        Thread.sleep(1000L);

        cancel = false;


    }

}

注意:上面的代码如果在线程的运行逻辑中有调用阻塞的方法,比如arrayBlockQueue的put操作,就会一直等待插入,直到队列有空位位置。就会导致cancel的判断永远不会执行。所以可以采用中断的方式

中断

采用interrupt()。对线程设置为中断标志。设置后不会立刻终端线程,而是待调用严格检查异常interruptException的时候就会停止,比如await,sleep等。
通常,interrupt是中断线程的最佳方式

通过future来取消

Future.cancle(boolean), true:任务正在当前线程执行,可以终端。false:如果任务还未执行,就不要运行。

注意:在调用了cancel方法后,再调用isDone将永远返回true

对于处理不可中断的阻塞

对于不能响应中断interruptException的阻塞。interrupt方法只能标志位可中断,但是无任何其他的作用。对于这些阻塞的中断 ,我们应该查找阻塞的原因,然后重写interrupt的方法来中断。

  • 1.java.io的socket io操作:常见的阻塞在于套接字的读取和写入。虽然inputstream和outputstream不会响应中断,但是可以通过关闭底层套接字的方式。是的read和write抛出socketexception。
  • 2.java同步io
  • 3.java异步io
  • 4.显示锁的Lock.lockinterruptibly.

// 待续

posted @ 2018-08-31 15:55  吃海苔的winton  阅读(180)  评论(0编辑  收藏  举报