1.使用flag
public class ThreadCloseGraceful { private static class Worker extends Thread { private volatile boolean start = true; @Override public void run() { while (start) { // } } public void shutdown() { this.start = false; } } public static void main(String[] args) { Worker worker = new Worker(); worker.start(); try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } worker.shutdown(); } }
2.使用线程中断方法结束
public class ThreadCloseGraceful2 { private static class Worker extends Thread { @Override public void run() { while (true) { if (Thread.interrupted()) break; } //------------- //------------- //------------- } } public static void main(String[] args) { Worker worker = new Worker(); worker.start(); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } worker.interrupt(); } }
3.使用守护线程结束
public class ThreadService { private Thread executeThread; private boolean finished = false; public void execute(Runnable task) { executeThread = new Thread() { @Override public void run() { Thread runner = new Thread(task); runner.setDaemon(true); runner.start(); try { runner.join(); finished = true; } catch (InterruptedException e) { //e.printStackTrace(); } } }; executeThread.start(); } public void shutdown(long mills) { long currentTime = System.currentTimeMillis(); while (!finished) { if ((System.currentTimeMillis() - currentTime) >= mills) { System.out.println("任务超时,需要结束他!"); executeThread.interrupt(); break; } try { executeThread.sleep(1); } catch (InterruptedException e) { System.out.println("执行线程被打断!"); break; } } finished = false; } }
测试:
public class ThreadCloseForce { public static void main(String[] args) { ThreadService service = new ThreadService(); long start = System.currentTimeMillis(); service.execute(() -> { //load a very heavy resource. /*while (true) { }*/ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } }); service.shutdown(10000); long end = System.currentTimeMillis(); System.out.println(end - start); } }