1、取消标志:任务可能永远不会检查取消标志,如BlockingQueue.put阻塞操作
2、中断:
1)它并不是真正地中断一个正在运行的线程,而只是发出中断请求,然后由线程在下一个合适的时刻中断自己
2)中断是实现取消的最合理方式
3)除非你知道中断该线程的含义,否则就不应该中断这个线程
4)中断策略:尽快退出执行流程
4、响应中断
1)传递异常
2)恢复中断状态(再次调用interrupt)
注:只有实现了线程中断策略的代码才可以屏蔽中断请求
5、在专门的线程中中断任务:RethrowableTask是主线程,r是子线程,t在两线程中共享
class RethrowableTask implements Runnable { private volatile Throwable t; public void run() { try { r.run(); } catch(Throwable e) { this.t = e } } public void rethrow() { if(t != null) { throw launderThrowable(t) } } }
6、非标准取消操作
1)处理不可中断的阻塞:改写写interrupt();
public void interrupt() { try { socket.close(); } catch(IOException e) { } finally { super.interrupt(); } }
2)采用newTaskFor来封装非标准的取消:click
7、使用ExecutorService的可停止日志服务
1)使用SingleThreadExecutor
2)stop方法调用 exec.shutdown;exec.awaitTermination
8、爬虫:通过判断isShutdown(),保存中断状态
9、未捕获异常的处理
public class UEHLogger implements Thread.UncaughtExceptionHandler { public void uncaughtException(Thread t, Throwable e) { logger.log(t.getName, e) } }
10、关闭钩子:用户实现服务或应用程序的清理工作,如删除临时文件或清除无法有系统自动清除的资源
11、守护线程:JVM启动时创建的所有线程中,除了主线程,其他的线程都是守护线程
时间: 2024-10-09 13:49:55