关闭线程的一些问题

  Thread.stop方法,虽然它确实停止了一个正在运行的线程,然而,这种方法是不安全也是不受提倡的,不应该使用stop方法来关闭Java的线程。

  正确的方法应该是设置volatile boolean stop = false;,这样所有线程可以及时发现stop值的变化,线程运行的过程中周期性或关键点检查stop值,当发现stop被其他线程置为了true时,终止线程的运行。

  但是上面的方法也有不完善的地方,当线程wait、sleep等情况下将无法判断stop的值,也就是说线程可能会永远的阻塞下去。所以希望关闭线程,除了周期性或关键点检查stop值,还要调用Interrupt来中断阻塞状态的线程。

  即使做了如上的操作,线程可能也不会立即终止,需要等待操作系统调度的结束。

  ExecutorService的shutdown是缓慢关闭线程池,无法加入新的任务,shutdownNow是希望立即关闭线程池,shutdownNow中就调用了interrupt,但是调用的是interrupt,也不会立即关闭。

  ExecutorService不调用shutdown,将会在所有任务完成后1分钟关闭线程池。

  

  

时间: 2024-10-11 06:13:34

关闭线程的一些问题的相关文章

Q关闭线程的三函数

Qt线程有3个函数可以关闭线程,分别是:1. void quit () 相当于exit(0). 2. void exit ( int returnCode = 0 )调用exit后,thread将退出event loop,并从exec返回,exec的返回值就是returnCode.通常returnCode=0表示成功,其他值表示失败. 3. void terminate ()结束线程,线程是否立即终止取决于操作系统.线程被终止时,所有等待该线程Finished的线程都将被唤醒.terminate

inux下C中怎么让才能安全关闭线程

前言: 多线程程序中,特别是频繁申请,释放线程的情况下,就要注意线程的关闭,最好使用线程池. 一,线程退出方式 (1) 执行完成后隐式退出: (2) 由线程本身显示调用pthread_exit 函数退出: pthread_exit (void * retval) ; (3) 被其他线程用pthread_cance函数终止: pthread_cance (pthread_t thread) ; 二,线程状态 pthread 线程有两种状态,joinable(非分离)状态和detachable(分离

JAVA并发编程9_正确关闭线程

Java没有提供任何的安全机制来终止线程,程,虽然Thread.stop和suspend等方法提供了这样的机制,但是存在严重的缺陷,应该避免使用这些方法. 它提供了中断(interrupt),这是一种协作机制,能够使一个线程终止另一个线程当前的工作. 一种协作机制是设置一个"已请求取消(Cancellation Requested)"标志,而任务定期查看该标志. "已请求取消"标志 private volatile boolean cancelled; public

Java关闭线程的安全方法

Java之前有一个api方法可以直接关闭线程,stop(),由于这个方法是强制性地关闭线程,有的时候会发生错误,之后就取消了,现在可用的方法主要有两种: 1.  在线程中加入一个成员变量,当一个flag使用.在线程run()方法中轮流去检查这个变量,变量变化时就退出这个线程.代码示例如下: public class StopThread extends Thread { private boolean _run = true; public void stopThread(boolean run

linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池

最近测试环境上测试的项目通过shutdown.sh始终无法彻底关闭. 之前临时解决方法两种: 第一:通过ps -ef|grep tomcat查看到tomcat的进程直接使用kill来杀死进程. 第二: 基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程 1.找到tomcat下bin/catalina.sh文件,vi进去添加点东西,主要是记录tomcat的pid,如下: 大概在第125行左右,添加如下代码 #设置CATALINA_PID(后加)if [ -z

一文教你安全的关闭线程池

上篇文章 ShutdownHook- Java 优雅停机解决方案 提到应用停机时需要释放资源,关闭连接.对于一些定时任务或者网络请求服务将会使用线程池,当应用停机时需要正确安全的关闭线程池,如果处理不当,可能造成数据丢失,业务请求结果不正确等问题. 关闭线程池我们可以选择什么都不做,JVM 关闭时自然的会清除线程池对象.当然这么做,存在很大的弊端,线程池中正在执行执行的线程以及队列中还未执行任务将会变得极不可控.所以我们需要想办法控制到这些未执行的任务以及正在执行的线程. 线程池 API 提供两

java 关闭线程

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); r

关闭线程

SetSoftElemMonitorRunning = false; QObject::disconnect(this, SIGNAL(ShowData(unsigned char*, int, QString)), this, SLOT(ShowDataSlot(unsigned char*, int, QString))); WaitForSingleObject(m_hTreadMonitor, INFINITE); TerminateThread(m_hTreadMonitor, 0);

web应用关闭后线程不回收问题

今天看<spring3.0企业应用开发实战>中关于web应用程序中调度器的启动和关闭问题中有这样一段话: 静态变量是ClassLoader级别的,如果web应用程序停止,这些静态变量也会从jvm中清除.但是线程则是JVM级别的,如果用户在web应用中启动一个线程,这个线程的生命周期并不会和web应用程序保持同步.也就是说,即使停止了web应用,这个线程也依旧是活跃的. 因此为了真正的验证上面的结论,实战了一下书中的例子 一 配置tomcat应用管理页面 1.首先启动tomcat后,通过web端