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

2023-06-12,,

停止线程的几种方式

一般的逻辑停止
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.

// 待续

【java并发编程实战第七章:取消与关闭的相关教程结束。

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

下载本文的Word格式文档,以方便收藏与打印。