`
zzhonghe
  • 浏览: 248146 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

shutdown和shutdownNow--多线程任务的关闭

    博客分类:
  • Java
阅读更多
采用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();
        }
分享到:
评论

相关推荐

    Android----线程实现图片移动

    对于`Thread`,可以调用`interrupt()`方法,而对于`Runnable`和`ExecutorService`,则需要调用`removeCallbacks()`或`shutdownNow()`。 7. **优化**: 为了提高性能,可以考虑使用`ObjectAnimator`或`ValueAnimator`...

    线程池管理多线程上传

    - **关闭线程池**:调用`shutdown()`或`shutdownNow()`方法,停止接收新任务,正在执行的任务会继续完成,已提交但未执行的任务处理取决于拒绝策略。 3. **多线程上传的应用**: - **文件拆分**:大文件在上传前...

    java多线程,对多线程,线程池进行封装,方便使用

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...

    java多线程学习-ftp上传

    4. 线程池的关闭:调用shutdown()或shutdownNow()方法,以及如何处理未完成的任务。 5. 配合Future和Callable接口获取任务结果和取消任务。 文件"forum.php.htm"、"691838.htm"、"6828269.htm"、"3957785.html"、"2...

    ExecutorService.shutdown()应该是在线程执行完毕后,才会去关闭

    在Java多线程编程中,`ExecutorService`是线程池的一个重要接口,它提供了管理和控制线程执行的能力。当我们创建一个`ExecutorService`实例并提交任务时,我们可以通过调用`shutdown()`方法来关闭线程池。然而,标题...

    线程池源码解析-多线程

    线程池是多线程编程中的重要工具,它允许开发者高效地管理和控制并发执行的线程,以提高系统性能和稳定性。在高并发场景下,线程池的使用显得尤为重要,因为它可以避免频繁创建和销毁线程所带来的开销。本文将深入...

    java多线程查询数据库

    通常,我们需要确保线程池的`shutdownNow()`方法可以在遇到错误时停止所有任务,并在主线程中处理异常。 ### 8. 性能优化与调优 在实际应用中,我们还需要关注查询性能,比如使用预编译的SQL(PreparedStatement)...

    multi-threaded-file-search.rar_多线程搜索

    在IT领域,多线程是并发编程中的一个重要概念,它允许程序同时执行多个任务,显著提高了计算机系统的效率。本示例“多线程文件搜索”着重于如何利用多线程来加速文件查找过程,这对于处理大数据量或者在大型文件系统...

    java并发(二十四)多线程结果组装

    在Java中,我们可以通过`ExecutorService`和`Future`来管理多线程任务,并获取它们的执行结果。`ExecutorService`是`java.util.concurrent`包中的一个接口,用于管理和控制线程的生命周期,如启动线程、关闭线程池等...

    多线程安全退出实例源代码

    5. **线程池的关闭**:对于由`ExecutorService`管理的线程,调用`shutdown()`或`shutdownNow()`方法可以安全地关闭线程池并停止所有未开始的任务。这也会通知正在运行的线程停止工作。 6. **finally块**:在多线程...

    Java多线程下载

    通过`execute()`方法提交任务,使用`shutdown()`或`shutdownNow()`方法关闭线程池。 3. **同步机制**:为了防止不同线程间的数据竞争,我们需要在共享资源(如文件写入)上使用同步机制,如`synchronized`关键字,`...

    java多线程断点下载

    8. **关闭线程池**:所有任务完成后,记得调用`ExecutorService.shutdown()`或`ExecutorService.shutdownNow()`来关闭线程池,释放资源。 在实际开发中,还可以考虑使用NIO(非阻塞I/O)技术,比如`java.nio....

    Java多线程编程线程的协同、停止、暂停、继续等操作实现

    线程池可以方便地管理和控制线程的创建、执行和销毁,包括停止所有线程的`shutdown()`和立即停止并取消所有任务的`shutdownNow()`方法。 6. **守护线程(Daemon Threads)** 守护线程是一种特殊类型的线程,它不会...

    java callable(多线程)

    ### Java Callable与多线程详解 在Java编程中,`Callable`接口是...通过以上分析和示例,我们可以看到`Callable`和`Future`在Java多线程编程中的强大功能,尤其是在需要处理复杂的异步任务和需要返回结果的情况下。

    JAVA多线程并发编程

    在适当的时候关闭线程池是非常重要的,`shutdown()`方法会等待所有已提交任务完成后再关闭,而`shutdownNow()`会立即停止所有正在执行的任务,并尝试停止待执行的任务。 总之,Java并发编程涉及线程的创建、同步、...

    多个文件开启固定线程等待下载--java实现

    - 若要立即停止所有任务和线程,可以使用`shutdownNow()`,但这可能会导致正在执行的任务被中断。 7. **示例代码**: - 创建一个固定大小的线程池: ```java ExecutorService executor = Executors....

    线程学习.docx

    - `shutdownNow()` 尝试取消正在队列中等待的任务,并中断正在执行的任务,以便尽快关闭线程池。 总之,选择合适的线程池类型取决于具体的应用场景和需求。理解每种线程池的特点和适用场景可以帮助开发者更好地...

    mutiThreadDownload.zip_GUI多线程文件

    线程池中的`submit()`方法可以提交任务,`shutdown()`或`shutdownNow()`可以关闭线程池。 3. **文件分块与下载**:在多线程下载中,大文件会被分成多个小块,每个线程负责下载一个或多个块。这需要用到文件I/O操作...

    TheadPool 线程池源码 自动管理线程的创建和销毁

    - `shutdownNow()`:尝试停止所有正在执行的任务,然后关闭线程池。 7. **`ThreadPool.cpp`与`ThreadPool.h`分析** 这两个文件可能是C++实现的线程池类定义和实现。`ThreadPool.h`可能包含了线程池类的声明,包括...

    Java多线程实现多兵种攻击炮塔案例

    在Java编程中,多线程是一项关键特性,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在这个“Java多线程实现多兵种攻击炮塔案例”中,我们将探讨如何利用Java的线程池技术来模拟不同兵种对炮塔的...

Global site tag (gtag.js) - Google Analytics