在java中识别和处理锁定线程的最佳方法

在java中识别和处理锁定线程的最佳方法,java,multithreading,lockup,Java,Multithreading,Lockup,我必须在新线程上调用函数第三方模块。从我所看到的,如果一切顺利,调用要么很快完成,要么永远挂起锁定线程。启动线程并进行调用并等待几秒钟的好方法是什么?如果线程仍然处于活动状态,那么假设它被锁定,在不使用任何不推荐的方法的情况下杀死(或停止或放弃)线程 我现在有类似的东西,但我不确定这是否是最好的方法,我想避免调用Thread.stop(),因为它已被弃用。谢谢 private void foo() throws Exception { Runnable runnable = ne

我必须在新线程上调用函数第三方模块。从我所看到的,如果一切顺利,调用要么很快完成,要么永远挂起锁定线程。启动线程并进行调用并等待几秒钟的好方法是什么?如果线程仍然处于活动状态,那么假设它被锁定,在不使用任何不推荐的方法的情况下杀死(或停止或放弃)线程

我现在有类似的东西,但我不确定这是否是最好的方法,我想避免调用Thread.stop(),因为它已被弃用。谢谢

private void foo() throws Exception
{
        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };
        Thread thread;
        thread = new Thread(runnable);
        thread.start();
        thread.join(3500);
        if (thread.isAlive())
        {
            thread.stop();
            throw new Exception();
        }

}

我将研究
java.util.concurrent
Executor
框架,特别是
Future
接口。通过这些,您可以从java.lang.Thread的变幻莫测中抽象出来,并且可以很好地将任务与它们的运行方式分离(无论是在单独的线程上,线程是来自池还是动态实例化,等等)

至少,未来的实例会为您提供
isDone
isCancelled
方法

Executor服务
Executor
的子界面)为您提供了一些关闭任何未完成任务的方法。或者查看执行器服务。等待终止(长超时,时间单位)方法

private void foo() throws Exception
{
        ExecutorService es = Executors.newFixedThreadPool(1);

        Runnable runnable = new Runnable()
        {

            @Override
            public void run()
            {
                    // stuff that could potentially lock up the thread.
            }
        };

        Future result = es.submit(runnable);

        es.awaitTermination(30, TimeUnit.SECONDS);

        if (!result.isDone()){
            es.shutdownNow();
        }

}

关于如何停止线程,它很好地涵盖了主题

没有办法(无条件地)做你想做的事情。例如,如果
东西可能会锁定线程。
看起来像这样,那么即使缺少System.exit(),也无法阻止它:


当应用程序卡住时,运行jstack(或使用调试器)。尝试找出函数的漏洞并修复它。

因此,基本上你想启动一个线程,如果它在某个时间段后仍处于活动状态,就停止它?或者使用:kill-QUIT pid获取JVM转储。不幸的是,我调用的函数位于第三方模块中,我无法控制它。所以,除非我从模块的作者那里得到更新,否则没有办法修复它。@Bala,你仍然应该努力确定问题是什么。您是否可能只能在单个线程中运行第三方代码?如果这是一个死锁问题,那么简单地阻止任何类型的代码并发执行都会有所帮助。另外,一旦你知道问题所在,你可以坚持要求第三方进行修复。我投反对票,因为调用你的方法“stop”最多只能说明你对线程中断的理解是幼稚和错误的。作为一个仅供参考的@Romain Hippeau,仅仅因为您在线程上调用中断并不意味着它将停止。如果这段代码的实现差到足以导致死锁,那么它肯定差到足以错误处理InterruptedException或不正确检查中断标志。@Tim Bender-问题是如何停止线程。例行程序的执行不是问题的一部分。如果你阅读我在答案中的链接,它涵盖了所有这些。为了记录在案,让它显示“我认为否决票是不公平的”。附言:谢谢你解释为什么不投反对票(我讨厌这样)
public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }
public void badStuff() {
 while (true) {
  try {
   wait();
  }
  catch (InterruptedException irex) {
  }
 }
}