采用5.0的线程池关闭线程,不管怎样,最后都是调用Interrupt.而interrupt这个方法,并不是什么情况下都能结束线程,释放资源。Interrupt只是在线程阻塞的时候,抛个异常出来,从而结束这个阻塞。
比如像下面的这种代码,就不管怎么shutdown,或者是shutdownNow,都不会关闭:
while(true){
try {
System.out.println("beat"); TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
因此,我们使用线程池的时候,不仅需要知道怎么开启,更需要知道怎么关闭,下面的比较好的写法:
while(!Thread.interrupted()){
try {
System.out.println("beat");
TimeUnit.MILLISECONDS.sleep(r.nextInt(1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//终结循环
Thread.currentThread().interrupt();
}
}
最后需要调用 executorService.shutdown(); 或者showdownNow()来终止这个任务。
这里有几点需要注意:
1. Thread.interrupted() 是一个测试线程是否已经被调用了interrupt的方法,因为如果已
经被调用的话,线程下次wait的时候,就会很粗暴的抛出一个异常来,Thread.interrupted()返回一个boolean,表示是否存在这种情形,不仅如此,它还会把已经调用的一个interrupt给清掉。(只能清掉一个)
2. shutdown方法: 这个方法,只能立刻interrupt那些目前没有任务,处于等待状态从blockingQueue获取任务的异常。而不能interrupt那些在任务执行过程中的thread,或者是任务执行过程中挂起的thread. 看一下实现代码就知道原因:
void interruptIfIdle() {
final ReentrantLock runLock = this.runLock;
if ([b]runLock.tryLock()[/b]) {
try {
thread.interrupt();
} finally {
runLock.unlock();
}
}
}
执行过程中的worker有锁,没有执行完任务,这个锁是不会释放的。
3. shutdownNow方法: 不管任务是否在执行中,一律interrupt,不去判断什么锁不锁。
void interruptNow() {
thread.interrupt();
}
分享到:
相关推荐
对于`Thread`,可以调用`interrupt()`方法,而对于`Runnable`和`ExecutorService`,则需要调用`removeCallbacks()`或`shutdownNow()`。 7. **优化**: 为了提高性能,可以考虑使用`ObjectAnimator`或`ValueAnimator`...
- **关闭线程池**:调用`shutdown()`或`shutdownNow()`方法,停止接收新任务,正在执行的任务会继续完成,已提交但未执行的任务处理取决于拒绝策略。 3. **多线程上传的应用**: - **文件拆分**:大文件在上传前...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...
4. 线程池的关闭:调用shutdown()或shutdownNow()方法,以及如何处理未完成的任务。 5. 配合Future和Callable接口获取任务结果和取消任务。 文件"forum.php.htm"、"691838.htm"、"6828269.htm"、"3957785.html"、"2...
在Java多线程编程中,`ExecutorService`是线程池的一个重要接口,它提供了管理和控制线程执行的能力。当我们创建一个`ExecutorService`实例并提交任务时,我们可以通过调用`shutdown()`方法来关闭线程池。然而,标题...
线程池是多线程编程中的重要工具,它允许开发者高效地管理和控制并发执行的线程,以提高系统性能和稳定性。在高并发场景下,线程池的使用显得尤为重要,因为它可以避免频繁创建和销毁线程所带来的开销。本文将深入...
通常,我们需要确保线程池的`shutdownNow()`方法可以在遇到错误时停止所有任务,并在主线程中处理异常。 ### 8. 性能优化与调优 在实际应用中,我们还需要关注查询性能,比如使用预编译的SQL(PreparedStatement)...
在IT领域,多线程是并发编程中的一个重要概念,它允许程序同时执行多个任务,显著提高了计算机系统的效率。本示例“多线程文件搜索”着重于如何利用多线程来加速文件查找过程,这对于处理大数据量或者在大型文件系统...
在Java中,我们可以通过`ExecutorService`和`Future`来管理多线程任务,并获取它们的执行结果。`ExecutorService`是`java.util.concurrent`包中的一个接口,用于管理和控制线程的生命周期,如启动线程、关闭线程池等...
5. **线程池的关闭**:对于由`ExecutorService`管理的线程,调用`shutdown()`或`shutdownNow()`方法可以安全地关闭线程池并停止所有未开始的任务。这也会通知正在运行的线程停止工作。 6. **finally块**:在多线程...
通过`execute()`方法提交任务,使用`shutdown()`或`shutdownNow()`方法关闭线程池。 3. **同步机制**:为了防止不同线程间的数据竞争,我们需要在共享资源(如文件写入)上使用同步机制,如`synchronized`关键字,`...
8. **关闭线程池**:所有任务完成后,记得调用`ExecutorService.shutdown()`或`ExecutorService.shutdownNow()`来关闭线程池,释放资源。 在实际开发中,还可以考虑使用NIO(非阻塞I/O)技术,比如`java.nio....
线程池可以方便地管理和控制线程的创建、执行和销毁,包括停止所有线程的`shutdown()`和立即停止并取消所有任务的`shutdownNow()`方法。 6. **守护线程(Daemon Threads)** 守护线程是一种特殊类型的线程,它不会...
### Java Callable与多线程详解 在Java编程中,`Callable`接口是...通过以上分析和示例,我们可以看到`Callable`和`Future`在Java多线程编程中的强大功能,尤其是在需要处理复杂的异步任务和需要返回结果的情况下。
在适当的时候关闭线程池是非常重要的,`shutdown()`方法会等待所有已提交任务完成后再关闭,而`shutdownNow()`会立即停止所有正在执行的任务,并尝试停止待执行的任务。 总之,Java并发编程涉及线程的创建、同步、...
- 若要立即停止所有任务和线程,可以使用`shutdownNow()`,但这可能会导致正在执行的任务被中断。 7. **示例代码**: - 创建一个固定大小的线程池: ```java ExecutorService executor = Executors....
- `shutdownNow()` 尝试取消正在队列中等待的任务,并中断正在执行的任务,以便尽快关闭线程池。 总之,选择合适的线程池类型取决于具体的应用场景和需求。理解每种线程池的特点和适用场景可以帮助开发者更好地...
线程池中的`submit()`方法可以提交任务,`shutdown()`或`shutdownNow()`可以关闭线程池。 3. **文件分块与下载**:在多线程下载中,大文件会被分成多个小块,每个线程负责下载一个或多个块。这需要用到文件I/O操作...
- `shutdownNow()`:尝试停止所有正在执行的任务,然后关闭线程池。 7. **`ThreadPool.cpp`与`ThreadPool.h`分析** 这两个文件可能是C++实现的线程池类定义和实现。`ThreadPool.h`可能包含了线程池类的声明,包括...
在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在这个“Java多线程实现多兵种攻击炮塔案例”中,我们将探讨如何利用Java的线程池技术来模拟不同兵种对炮塔的...