thread

本文介绍如何使用Java中的ExecutorService正确地关闭线程池,包括shutdown()和shutdownNow()的区别及其应用场景。同时,提供了实用的代码示例来演示如何确保线程池能够优雅地关闭。

Thread.interrupt()方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。 


可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。 

下列方法分两个阶段关闭 ExecutorService。第一阶段调用 shutdown 拒绝传入任务,然后调用 shutdownNow(如有必要)取消所有遗留的任务: 

 void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }

shutdown调用后,不可以再submit新的task,已经submit的将继续执行。

shutdownNow试图停止当前正执行的task,并返回尚未执行的task的list



Thread 类是 JVM 用于管理线程的类,每个线程都有一个 Thread 对象与之关联,JVM 会将这些 Thread 对象组织起来,用于线程调度和管理[^2]。 ### 功能与特性 Thread 对象具有 ID、名称、优先级、状态等属性,这些属性被 JVM 用于线程的调度和管理。在多线程环境下,根据多线程的内存原理,会开辟包含主线程的多个栈空间供 CPU 执行不同线程,不过线程执行的优先级通常由 CPU 决定,用户较难控制[^2][^3]。 ### 常见构造方法 - `Thread()`:创建一个线程对象。 - `Thread(Runnable target)`:使用 Runnable 对象创建线程对象。 - `Thread(String name)`:创建线程对象,并为其命名。 - `Thread(Runnable target, String name)`:使用 Runnable 对象创建线程对象,并为其命名[^2]。 ### 使用方法 #### 线程创建 - **继承 Thread 类,重写 run 方法** ```java class MyThread extends Thread { @Override public void run() { System.out.println("继承 Thread 类创建的线程在执行"); } } // 使用示例 MyThread thread = new MyThread(); thread.start(); ``` - **实现 Runnable 接口,重写 run 方法** ```java class MyRunnable implements Runnable { @Override public void run() { System.out.println("实现 Runnable 接口创建的线程在执行"); } } // 使用示例 Runnable runnable = new MyRunnable(); Thread thread = new Thread(runnable); thread.start(); ``` - **继承 Thread 类,重写 run 方法,使用匿名内部类** ```java Thread thread = new Thread() { @Override public void run() { System.out.println("使用匿名内部类继承 Thread 类创建的线程在执行"); } }; thread.start(); ``` - **实现 Runnable 接口,重写 run 方法,使用匿名内部类** ```java Runnable runnable = new Runnable() { @Override public void run() { System.out.println("使用匿名内部类实现 Runnable 接口创建的线程在执行"); } }; Thread thread = new Thread(runnable); thread.start(); ``` - **使用 lambda 表达式(最推荐)** ```java Thread thread = new Thread(() -> { System.out.println("使用 lambda 表达式创建的线程在执行"); }); thread.start(); ``` #### 线程中断 - **使用标志位来控制线程是否要停止** ```java class MyThread extends Thread { private volatile boolean isStopped = false; @Override public void run() { while (!isStopped) { System.out.println("线程正在执行"); } System.out.println("线程已停止"); } public void stopThread() { isStopped = true; } } // 使用示例 MyThread thread = new MyThread(); thread.start(); thread.stopThread(); ``` - **使用 Thread 自带的标志位来控制线程是否要停止** ```java Thread thread = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("线程正在执行"); } System.out.println("线程已停止"); }); thread.start(); thread.interrupt(); ``` #### 线程等待 在 Java 中,可以使用 `join()` 方法让一个线程等待另一个线程执行完毕。例如: ```java Thread thread1 = new Thread(() -> { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程 1 执行完毕"); }); Thread thread2 = new Thread(() -> { try { thread1.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程 2 在等待线程 1 执行完毕后执行"); }); thread1.start(); thread2.start(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值