JAVA里如何安全有效地停止(或者说销毁)线程?请指点,万分感谢! 100分不够可以在别的地方加,主要还是交流为主. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 比如A线程和B线程 , A线程监视B线程的工作情况 , B线程用于处理某项工作,这项工作是有时间要求的,如果这项工作没有在规定时间内完成,则A线程需将B线程关闭.这该如何实现呢? 如果确保数据不会被破坏,可以使用stop方法强制停止 多线程的话,可以设置线程运行标志,并用队列进行管理! 线程是不能立即停止的,但可以加快销毁,比如置线程对象为null! 当然这种方式不可取,最好用程序控制让完成任务的线程处于睡眠状态,然后再有任务的时侯再唤醒,这种就形成了线程池 stop()和destroy()方法都不被SUN推荐使用了.而用while(flag){}方式也不妥,因为如果在while(flag)里阻塞了的话,这个flag其实没法立即起作用啊 大家一起讨论吧,不要让这个帖子沉下去.也许这是Java的线程中断机制的缺陷啊. private volatile Thread b; public void stopIt() { Thread temp = b; b = null; temp.interrupt(); b = null; } public void run() { Thread thisThread = Thread.currentThread(); while (b == thisThread) { try { thisThread.sleep(interval); //B要执行的代码在这里 } catch (InterruptedException e){ } } }调用stopIt方法可以安全结束b进程。 private volatile Thread b; public void stopIt() { Thread temp = b; b = null; temp.interrupt(); } public void run() { Thread thisThread = Thread.currentThread(); while (b == thisThread) { try { thisThread.sleep(interval); //B要执行的代码在这里 } catch (InterruptedException e){ } } }修改一下,多写了个b = null。关键在interrupt方法使其生成异常,结束一个while循环从而结束进程 allenchue(allenchue) 的方法好象是自找苦吃只要在wait和sleep的时候才可以中断呀执行代码的时候根本不可能响应你这样是比用一个标志位差很多线程强行中断也并不是java的缺陷呀,操作系统本身也是处理不好的. 我支持 xiaobzg(小兵张嘎) 的意见,用线程池,当一个线程不再使用,将其放入一个队列,需要用的时候再取出来,而不用创建新线程节省系统开销 设置一个watch dog, 该线程被实现为Singleton,保存一个需要监视的线程的Vector, 被监视线程对Watch dog定时punch, Watch dog定时检查所有被监视线程的punch情况,若某个线程超过规定时间未喂狗,Watch dog即重启被监视线程.这种设计来源于硬件看门狗.我们的项目中就是这样用的,效果很好. TO FreeSeagull(孤海闲鸥): 重启是什么一种做法呢? 设置被监视线程的一个标志来退出循环, 然后调用被监视线程的interrupt().这样可以退出wait()等函数造成的死锁等待并进而根据刚才设置的标志退出run()中的循环. To FreeSeagull(孤海闲鸥)如果不是wait等机制产生的等待, 而仅仅因为方法内部工作量大, 超过了规定的时间. 比如while(blinker == Thread.currentThread()){ doJob();}...public void stop(){ blinker = null;}这个时候doJob根本没有执行完,怎么可能去判断blinker.该不会在doJob里边,时不时的加一些flag的判断吧....这样也太影响程序的效率和美观了吧.... 我觉得,如果doJob()的执行不可观测,那么我们根本就无法实现对它的可控性。《线性系统》当年搞得我要死要活的,不过,这个应该还是正确地。既然无法观测就无从谈起控制它的稳定。要想可控,必须可观。 建议使用concurrent包。里面有很多解决线程问题的方法。 一个线程等另外一个线程用join不好吗?等下班了回家实现,如果行再贴出程序 一般来说,是用stop 方法。但是,java有这样一个问题,就是有的时候JVM的内存释放很缓慢,当你关闭java编译器的时候,JVM 还会长时间的占用内存空间。 是不是可以说JVM还是不完善呢? 接口 JTextField键盘触动自动刷新的方法是什么? java调用matlab代码 怎样修改JFrame的大小 什么打在JAR包里的资源不能用 JAVA 最简单的问题 求JAVA GUI高手帮忙,谢谢!! 关于display tag的列的显示长度的问题 图形刷新问题 我该怎么样为一个Timestamp对象赋一个指定日期值比如2006-4-26 17:30 有人了解SNMP么?有用java开发过的人么? 进来看看谢谢!
Thread temp = b;
b = null;
temp.interrupt();
b = null;
} public void run() {
Thread thisThread = Thread.currentThread();
while (b == thisThread) {
try {
thisThread.sleep(interval);
//B要执行的代码在这里
} catch (InterruptedException e){
}
}
}
调用stopIt方法可以安全结束b进程。
Thread temp = b;
b = null;
temp.interrupt();
} public void run() {
Thread thisThread = Thread.currentThread();
while (b == thisThread) {
try {
thisThread.sleep(interval);
//B要执行的代码在这里
} catch (InterruptedException e){
}
}
}修改一下,多写了个b = null。关键在interrupt方法使其生成异常,结束一个while循环从而结束进程
只要在wait
和sleep的时候才可以中断呀
执行代码的时候根本不可能响应你这样是比用一个标志位差很多线程强行中断也并不是java的缺陷呀,操作系统本身也是处理不好的.
重启是什么一种做法呢?
如果不是wait等机制产生的等待, 而仅仅因为方法内部工作量大, 超过了规定的时间. 比如
while(blinker == Thread.currentThread())
{
doJob();
}
...
public void stop()
{
blinker = null;
}这个时候doJob根本没有执行完,怎么可能去判断blinker.
该不会在doJob里边,时不时的加一些flag的判断吧....
这样也太影响程序的效率和美观了吧....
等下班了回家实现,如果行再贴出程序
但是,java有这样一个问题,就是有的时候JVM的内存释放很缓慢,当你关闭java编译器的时候,JVM 还会长时间的占用内存空间。