日期:2014-05-20  浏览次数:21465 次

java 让一个线程一直运行
比如这线程停了,马上唤醒它!让他一直运行,有什么方法,写死循行不通!

------解决方案--------------------
要求高的话,启动两个线程,互相监控,并监控工作线程。停了任何一个,就重启它。

再高点要求,启动两个JVM,互相监控,并监控第三个工作JVM,停了就启动它。
------解决方案--------------------
实时性没有这么高吧?
crontab
或者一些定时器就可以了
探讨
我还是说下我的需求吧!
就是不停的上传一个文件夹的文件,并把相关信息写入数据库!
望大侠指导下思路!

------解决方案--------------------
首先,如果线程抛出的异常和错误都被捕获处理了,并且是在死循环里面处理的,那么,这个线程,
只要不被其他线程干掉,或者,JVM没有退出,那么,它是不会停下的。
楼主说的,死循环几个月,线程就停掉,这种现象,通常是不会存在的,除非:
1.线程代码里,出现未捕获的异常或错误,将线程抛停。(这种情况下,一般记录不到日志,所以,不好查出问题)
2.该线程被其他线程干掉了。
3.JVM因为某种原因退出了。

其次,程序出现不稳定状况,首先进行的,应该是排错,之后,才是容错。
创建监控线程,就是容错的一种,通过定时检查,重新启动线程。

第三,唤醒是在线程阻塞状态下才能生效的操作,一个已经正常退出或异常退出的线程,进行唤醒是无效的。

第四,我写个死循环的用例给楼主参考一下,仅供讨论。
Java code

volatile boolean running = true;
long cycle = 1000;
public void run(){
while(running){
try{doCycle()}catch(Throwable t){
//可以记录异常信息
}
try{Thread.sleep(cycle);}catch(Exception e){}
}
}

private void doCycle(){
//死循环内进行的事情。
}

------解决方案--------------------
之前我也遇到过这样的问题,我是通过监控线程来处理的。
把要执行的任务放线程中 while(bool){
//bool为布尔值。

},一般情况下线程停止。除非是出现了异常,线程被锁了。。。等等情况,有可能出现还活着线程,但是没有执行任务。最好把线程放线程池中控制。
定义一个volatile Date excuteTime,每次任务执行时,改变excuteTime为当前值。
定义一个守护线程,while(true){} 间隔检测excuteTime,与当前时间进行比对。判断线程任务是否存活。如果线程锁了或死了,重启线程。
如果还觉得不保险,可以在多定义守护线程,线程之间相互监控。

------解决方案--------------------
探讨
引用:
要求高的话,启动两个线程,互相监控,并监控工作线程。停了任何一个,就重启它。

再高点要求,启动两个JVM,互相监控,并监控第三个工作JVM,停了就启动它。


嗨,java 要写一个实时性上传工具还真麻烦!

------解决方案--------------------
public class testThread extends Thread{
public void run(){
// business logic
}
}

public class Monitor extends Thread{
public void run(){
while(true){
if(null != Invoke.thread){
if(Invoke.thread.getState()==Thread.State.WAITING)
{ Invoke.thread.notify();
}
...

this.wait(5000);
}
}
}
}

public class Invoke {

private static Thread thread;

public void invoke(){
TestThread test = new TestThread()
thread = test;
Monitor m = new Monitor();
m.start();
test.start();
}
public void run(){

}