加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java – 等待第三方线程完成

发布时间:2020-12-14 06:05:01 所属栏目:Java 来源:网络整理
导读:我有一个运行第三方库的线程,它也将运行自己的线程.当我的线程的run方法完成时,第三方线程将不会完成. 那么,在这些外部线程仍在运行之前,保持我的线程的最佳方法是什么? 解决方法 如果您是一个应用程序而不必担心SecurityManager限制,并且如果您准备在更新
我有一个运行第三方库的线程,它也将运行自己的线程.当我的线程的run方法完成时,第三方线程将不会完成.

那么,在这些外部线程仍在运行之前,保持我的线程的最佳方法是什么?

解决方法

如果您是一个应用程序而不必担心SecurityManager限制,并且如果您准备在更新第三方代码时偶尔修改代码,则可以使用ThreadGroup的工具来遍历线程并通过以下方式识别它们:名称或包含它们的线程组.

一旦找到了线程,就可以在它们完成之前监视它们,或者在适当的时候使用Thread.join().

举个例子,这里有一些工作代码转储JVM中的所有线程:

public void printThreads(PrintWriter wtr) {
    ThreadGroup     root;

    totGroups=0;
    totThreads=0;

    for(root=Thread.currentThread().getThreadGroup(); root.getParent()!=null; root=root.getParent()) {}
    wtr.println("Thread Dump:");
    printThreadGroup(wtr,root,"  ");
    wtr.println("  -- Total Groups: "+totGroups+",Total Threads: "+totThreads);
    }

public void printThreadGroup(PrintWriter wtr,ThreadGroup grp,String pfx) {
    try {
        Thread[]        thds;
        ThreadGroup[]   grps;

        totGroups++;
        wtr.println(pfx+"Group: "+grp.getName()+","+(grp.isDaemon()?"Daemon":"Normal")+","+(grp.isDestroyed()?"Destroyed":"Alive")+","+grp.getMaxPriority());
        thds=new Thread[grp.activeCount()];
        grp.enumerate(thds,false);
        Arrays.sort(thds,THREAD_SORTER);
        for(int xa=0; xa<thds.length && thds[xa]!=null; xa++,totThreads++) {
            Thread          thd=thds[xa];
            wtr.println(pfx+". - ["+thd.getName()+","+(thd.isDaemon()?"Daemon":"Normal")+","+(thd.isAlive()?"Alive":"Not Started or Dead")+","+thd.getPriority()+"]");
            }

        grps=new ThreadGroup[grp.activeGroupCount()];
        grp.enumerate(grps,false);
        Arrays.sort(grps,GROUP_SORTER);
        for(int xa=0; xa<grps.length && grps[xa]!=null; xa++) {
            printThreadGroup(wtr,grps[xa],(pfx+". "));
            grps[xa]=null;
            }
        }
    catch(Throwable thr) {
        wtr.println("  Cannot print threads ("+thr+")");
        }
    }

public void printStacks(PrintWriter wtr) {
    wtr.println("Thread Stack Traces:");
    try { javaMx.printStacks(wtr); } catch(Throwable thr) { wtr.println("  Cannot print stacks ("+thr+")"); }
    wtr.println("  --");
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读