性能问答>Java中有没有获取指定线程的方法?或者检测指定线程是否存在的方法?>
7回复
1年前

Java中有没有获取指定线程的方法?或者检测指定线程是否存在的方法?



Java中有没有获取指定线程的方法?或者检测指定线程是否存在的方法?

比我启动了一个线程去执行任务,给这个线程起名字叫A线程。过了30分钟或者一段时间之后我想检测一下这个A线程还是否存在/存活。是否存在这样一个方法,输入线程的名字或者线程的ID,然后可以返回相对应线程的对象。

应用场景:在系统中我有一个定时任务,启动了一个A线程(处理这个任务的线程名字是固定的)去处理数据,这个数据很多,有可能要处理俩天。但是处理一半的时候,系统要发个版本,那这个线程肯定就没了,或者处理一半的时候代码抛出异常,线程也会自动消失。所以,我想隔一段时间去检测一下A线程是否存在,如果不存在就启动一个线程继续处理数据。

2630 阅读
请先登录,再评论

我这个问题大家不用看了,我感觉我问题描述的有点问题,我要再想想。打扰大家了。

1年前

来自网友[speace]的思路:线程抛出异常终止我理解做一下异常处理出错继续下一条就可以避免了,发版导致的话可以在系统关闭的钩子里在本地创建文件记录一下,你的定时任务要设置成过一个小时执行检测一下这个文件是不是之前的任务挂了,但是要运维不能kill -9杀进程,如果是spring容器的话直接在容器启动事件里监听重启一下你的任务?就可以解决发版导致的任务终止了,我只能想到这两种

1年前

来自网友[是胖虎吗?]的思路:或者把大任务拆成小任务,然后放到mq中拉出来跑,跑的结果放到中间库中,最后都跑完了刷到结果中

1年前

现写的一个demo

public class NeverDeadThread extends Thread {

    private static int num = 0;

    static {
        startNewThread();
    }

    public static void startNewThread() {
        new NeverDeadThread().start();
    }

    @Override
    public void run() {
        try {
            while (true) {
                System.out.println(Thread.currentThread().getName() + "正在运行" + (++num));
                if (num % 10 == 0) {
                    throw new Abort();
                }
                Thread.sleep(100);
            }
        } catch (Throwable e) {
            e.printStackTrace();
            startNewThread();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Class<NeverDeadThread> clazz = NeverDeadThread.class;
        Thread.sleep(100000);
    }
}
11年前

一 . 通过自己完成的话,可以使用ThreadMxBean操作:
1.getAllThreadIds()获得所有Thread Id
2.getThreadCpuTime(tids)获得所有线程的CPU时间 (以及SYS CPU,内存分配)
排序后,
3.用getThreadInfo(tids)获得前N名线程或者直接轮询所有线程的信息,然后看看有没有你想要的那个线程,因为不取线程的StackTrace,不会堵塞应用。

二 .借助工具
1.Arthas里面的Thread命令可以十分方便的完成你的目的
2.VJTop,专门观察JVM进程指标及其繁忙线程

现在这些工具貌似都以插件的方式集成到了笨马的开源项目XPocket里了,可以去用用看看

11年前

来自网友zyj的回复:自定义线程名jps里grep至少能找到吧,不知道有木有更优雅的

1年前

插眼!

1年前