xxljob中終止定時任務的方式是通過Thread.interrupt()+處理中斷異常的方式強制終止任務的。所以單純的線程只要進行阻塞操作就可以實現終止。
但是代碼里已經遍布了ThreadPoolExecutor創建出來的線程池,嘗試各種方式線程內部都不能感受到外部線程的interrupt,嘗試了多次無果。
今天忽然想明白了,在外部線程中等待線程池執行完成的地方,處理線程的終止異常,拋出異常給xxljob進行捕獲同時,調用線程池的shutdownNow()方法即可。
由於shutdownNow()的實現方式實際還是Thread.interrupt(),所以只要線程內部在合適的地方加上Thread.sleep(x)即可。