一定要注意子线程的InterruptedException异常处理,要throw出来,不要吞掉!
正确案例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Demo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new SubThread());
executorService.submit(new SubThread());
executorService.shutdown();
try {
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
System.out.println("线程池关闭超时");
executorService.shutdownNow();
if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
System.out.println("线程池强制关闭失败");
} else {
System.out.println("线程池强制关闭成功");
}
} else {
System.out.println("线程池关闭成功");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
class SubThread implements Runnable {
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// 抛出异常
throw new RuntimeException(e);
}
}
}
}
错误案例:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Demo {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new SubThread());
executorService.submit(new SubThread());
executorService.shutdown();
try {
if (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
System.out.println("线程池关闭超时");
executorService.shutdownNow();
if (!executorService.awaitTermination(3, TimeUnit.SECONDS)) {
System.out.println("线程池强制关闭失败");
} else {
System.out.println("线程池强制关闭成功");
}
} else {
System.out.println("线程池关闭成功");
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
class SubThread implements Runnable {
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// 没有抛出异常,线程池将卡死,无法退出
e.printStackTrace();
}
}
}
}