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

解决方案 »

  1.   

    写另一个线程,不断循环检查你那个工作线程,用Sleep控制比如每隔1000毫秒检查一次好了。不过总觉得你这个需求比较诡异。
      

  2.   

    放心,不是做什么害人的事情!2楼,能给个demo不?没思路!
      

  3.   

    Thread.getState() 方法就能得到目标线程的状态了,不需要啥布尔值。
      

  4.   

    public static void main(String[] args) {
    OrderThread mt = new OrderThread();
    boolean flag = true;
    while (flag) {
    mt.run();
    }
    }让你跑个够!!
      

  5.   

    要求高的话,启动两个线程,互相监控,并监控工作线程。停了任何一个,就重启它。再高点要求,启动两个JVM,互相监控,并监控第三个工作JVM,停了就启动它。
      

  6.   


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

  7.   

    这让我想到一个框架,quartz ,我去试试能不能达到要求!
      

  8.   


    那你的问题变成了:如果quartz死掉了,有没有方法自动重启它?
      

  9.   

    实时性没有这么高吧?
    crontab
    或者一些定时器就可以了
      

  10.   

    首先,如果线程抛出的异常和错误都被捕获处理了,并且是在死循环里面处理的,那么,这个线程,
    只要不被其他线程干掉,或者,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(){
    //死循环内进行的事情。
    }
      

  11.   


    不要片面的理解优先级,曾经我查过资料,哪怕你设置成max优先级也没用的!
    长时间得不到运行的线程会从阻塞变成运行态的,cpu会分配时间段不是一直给最大优先级的!
      

  12.   

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

  13.   

    我觉得应该不是java麻烦吧,查查自身的问题吧。
      

  14.   

    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(){}
      

  15.   

    直接写个while(true)不就行了?
      

  16.   

    try里用while()catch 里运行自身不就行了吗.....
      

  17.   

    在java API 中的 Executors 类 中有一个方法newSingleThreadExecutor( ),
    newSingleThreadExecutor( )创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
      

  18.   

    在一个大型系统中使用过quartz做异步的作业,也是用来对几个文件夹中的文件进行操作,我想满足你的需求完全没问题.
      

  19.   

    if(要结束了){obj.wait();}//要等待的线程
    if(要唤醒){obj.notify();}//其他线程
    obj是同一个锁
      

  20.   

    jdk中有个Executors 类,里面有个创建单线程池的方法,这个方法能够保证始终有个线程在运行,假设当前线程死了,会马上创建一个新的线程,楼主可以参考下。