一些系统调用,在阻塞过程中并不会检查中断标志位,比如 read
那么这种情况下,该如何中断此线程呢?
package com.ls.juc.executor.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ShutdownBlockingIOTest {
ServerSocket ss;
Socket sk;
/**
* @param args
*/
public static void main(String[] args) {
new ShutdownBlockingIOTest().shutdownBlockingIO();
}
public void shutdownBlockingIO() {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new Runnable() {
public void run() {
try {
ss = new ServerSocket(9999);
sk = ss.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(sk.getInputStream()));
while(true) {
// 当线程在readLine时,另一个线程interrupt这个线程,这个线程不会检查中断标志
// 中断这个线程的一种方式就是关闭socket
String line = reader.readLine();
System.out.println("Have Read line: " + line);
}
} catch (IOException e) {
System.out.println("执行IO时出现异常!!!");
}
}
});
//executor.shutdown();
executor.shutdownNow(); // interrupt worker thread
try {
int i = 0;
while(!executor.awaitTermination(100, TimeUnit.MILLISECONDS)) {
System.out.println("等待线程池终止!!!");
i++;
if(i > 100) { // 中断线程后,如果一段时间过后,线程仍没有终止,关闭socket
sk.close();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
System.out.println("关闭socket时抛出异常!!!");
}
}
}