之前我也遇到过这样的问题,我是通过监控线程来处理的。 把要执行的任务放线程中 while(bool){ //bool为布尔值。},一般情况下线程停止。除非是出现了异常,线程被锁了等等情况,有可能出现还活着线程,但是没有执行任务。最好把线程放线程池中控制。 定义一个volatile Date excuteTime,每次任务执行时,改变excuteTime为当前值。 定义一个守护线程,while(true){} 间隔检测excuteTime,与当前时间进行比对。判断线程任务是否存活。如果线程锁了或死了,重启线程。 如果还觉得不保险,可以在多定义守护线程,线程之间相互监控。
我觉得应该不是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(){}
直接写个while(true)不就行了?
try里用while()catch 里运行自身不就行了吗.....
在java API 中的 Executors 类 中有一个方法newSingleThreadExecutor( ), newSingleThreadExecutor( )创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
OrderThread mt = new OrderThread();
boolean flag = true;
while (flag) {
mt.run();
}
}让你跑个够!!
嗨,java 要写一个实时性上传工具还真麻烦!
那你的问题变成了:如果quartz死掉了,有没有方法自动重启它?
crontab
或者一些定时器就可以了
只要不被其他线程干掉,或者,JVM没有退出,那么,它是不会停下的。
楼主说的,死循环几个月,线程就停掉,这种现象,通常是不会存在的,除非:
1.线程代码里,出现未捕获的异常或错误,将线程抛停。(这种情况下,一般记录不到日志,所以,不好查出问题)
2.该线程被其他线程干掉了。
3.JVM因为某种原因退出了。其次,程序出现不稳定状况,首先进行的,应该是排错,之后,才是容错。
创建监控线程,就是容错的一种,通过定时检查,重新启动线程。第三,唤醒是在线程阻塞状态下才能生效的操作,一个已经正常退出或异常退出的线程,进行唤醒是无效的。第四,我写个死循环的用例给楼主参考一下,仅供讨论。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(){
//死循环内进行的事情。
}
不要片面的理解优先级,曾经我查过资料,哪怕你设置成max优先级也没用的!
长时间得不到运行的线程会从阻塞变成运行态的,cpu会分配时间段不是一直给最大优先级的!
把要执行的任务放线程中 while(bool){
//bool为布尔值。},一般情况下线程停止。除非是出现了异常,线程被锁了等等情况,有可能出现还活着线程,但是没有执行任务。最好把线程放线程池中控制。
定义一个volatile Date excuteTime,每次任务执行时,改变excuteTime为当前值。
定义一个守护线程,while(true){} 间隔检测excuteTime,与当前时间进行比对。判断线程任务是否存活。如果线程锁了或死了,重启线程。
如果还觉得不保险,可以在多定义守护线程,线程之间相互监控。
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(){}
newSingleThreadExecutor( )创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
if(要唤醒){obj.notify();}//其他线程
obj是同一个锁