weixin_42376672
fuliang lee
2010-06-10 09:54

监控线程如何重启?

已采纳

我在做一个文件传输的功能,功能是一个监听线程(如下代码)监听一个文件下载队列就是doTranferFile()方法所做的事情,我将该方法抱在try和catch中防止由于异常将线程停止,但是由于一些不详的原因这个线程仍然会莫名其妙的停掉让我很头疼,我打算做一个机制来监控这个监听线程是否已经死掉,我想问问各位老师这个机制该怎么去实现,如何实现重启这个线程?或者说我这种应用场景有没有一个简单一点的开源框架满足我的要求
[code="java"]
public class TranferMonitor extends Thread {
public TranferMonitor(){
}
private boolean loop = true;

private void sleepForAwhile(long time) {
    try {
        Thread.sleep(time);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
public void run() {
    while (this.loop) {
        this.sleepForAwhile(50);
        try {
            this.doTranferFile();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

}
[/code]

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • zhujinguo2009 zhujinguo2009 11年前

    [code="java"] ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    scheduledExecutorService.scheduleAtFixedRate(new ServerMainThread(), 0,10, TimeUnit.SECONDS);[/code]

    点赞 评论 复制链接分享
  • yingxiongtnt yingxiongtnt 11年前

    晕,没看见你还有个要求,就是线程如果终止了,你还要重启,那就将monitor()这个方法内容给成这样就行了:

    [code="java"]/**
    * 监控主要逻辑
    */
    private void monitor() {

         Thread.State state = monitoredThread.getState();  //获得指定线程状态
    
        System.out.println("监控线程状态是:"+monitoredThread.getState());
    
        /*
         * 如果监控线程为终止状态,则重启监控线程
         */
        if( Thread.State.TERMINATED.equals(state)) {
            System.out.println("监控线程已经终止,现在开始重启监控线程!");
            monitoredThread.start();
        }
    }[/code]
    
    点赞 评论 复制链接分享
  • yingxiongtnt yingxiongtnt 11年前

    首先,说明一下:做监控,最好的就是JMX了,但这个一般人不怎么会用,我也一样,懂点皮毛。我根据你的需求也写了采用JMX标准来实行的监控,但那要借助于浏览器(我刚学,就知道这么点),不能自动监控,隔段时间点一下,说这些,就是希望你有时间、有兴趣可以研究下。

    我还用程序写了个监控线程,是用来监控你的监控类TranferMonitor 用的,代码贴在下面,想要看看效果直接运行就行了

    [code="java"]package com.thread;

    import java.util.concurrent.TimeUnit;

    public class Monitor implements Runnable {

    private Thread monitoredThread;    //要监控的线程名
    
    public Monitor(Thread monitoredThread) {
        this.monitoredThread = monitoredThread;
    }
    
    public void run() {
        while(true) {
            monitor();
            try {
                TimeUnit.MILLISECONDS.sleep(2000);
            } catch (InterruptedException e) {
                //TODO  记日志
                e.printStackTrace();
            }
        }
    
    }
    
    /**
     * 监控主要逻辑
     */
    private void monitor() {
        System.out.println("监控线程状态是:"+monitoredThread.getState());
    }
    
    /**
     * 测试方法
     */
    public static void main(String[] args) {
    
        TranferMonitor tm = new TranferMonitor();
    
        Monitor m = new Monitor(tm);
        new Thread(m).start();
        tm.start();
    }
    

    }[/code]

    3.如果你想用工具监控,可以在google上找找,或直接使用Jconsole(JDK自带),我用了,但觉得效果不好

    点赞 评论 复制链接分享
  • kobe13485 kobe13485 11年前

    [code="java"]
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.Executor;
    import java.util.concurrent.Executors;

    /**

    • 测试监控类
    • @author
    • */ public class WatchThread {

    /**

    • 测试函数
    • @throws InterruptedException */ public void testThread() throws InterruptedException { int threadNum = 10; //初始化countDown CountDownLatch threadSignal = new CountDownLatch(threadNum); //创建固定长度的线程池 Executor executor = Executors.newFixedThreadPool(threadNum); for (int i = 0; i < threadNum; i++) { //开threadNum个线程
      Runnable task = new TestThread(threadSignal); //执行 executor.execute(task); } threadSignal.await(); //等待所有子线程执行完
      //do work System.out.println(Thread.currentThread().getName() + "+++++++结束."); }

    /**

    • 测试函数 */ public static void main(String[] args) throws InterruptedException { WatchThread test = new WatchThread(); test.testThread(); }

    /**

    • @author jill
    • */ private class TestThread implements Runnable { private CountDownLatch threadsSignal;

    public TestThread(CountDownLatch threadsSignal) {
    this.threadsSignal = threadsSignal;
    }

    public void run() {
    System.out.println(Thread.currentThread().getName() + "开始...");
    //do shomething
    System.out.println("开始了线程::::" + threadsSignal.getCount());
    //线程结束时计数器减1
    threadsSignal.countDown();

    System.out.println(Thread.currentThread().getName() + "结束. 还有"

    • threadsSignal.getCount() + " 个线程"); } }

    }
    [/code]
    自己参考下修改吧

    点赞 评论 复制链接分享

相关推荐