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

时间:2010-06-17 19:14:19

标签: java multithreading lockup

我必须在新线程上调用函数第三方模块。从我所看到的情况来看,如果一切顺利,呼叫要么快速完成,要么只是因为锁定线程而挂起。什么是启动线程并进行调用并等待几秒的好方法,如果线程仍处于活动状态,则假设它已被锁定,在不使用任何弃用方法的情况下终止(或停止或放弃)线程。

我现在有类似的东西,但我不确定这是否是最好的方法,我想避免调用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();
        }

}

3 个答案:

答案 0 :(得分:2)

public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }
关于如何停止线程的

See this link,它涵盖了主题

答案 1 :(得分:1)

没有办法做你想要的(无条件)。例如,如果stuff that could potentially lock up the thread.看起来像这样,就没有办法阻止它,只缺少System.exit():

public void badStuff() {
 while (true) {
  try {
   wait();
  }
  catch (InterruptedException irex) {
  }
 }
}

当您的应用卡住时,请运行jstack(或使用调试器)。试着弄清楚功能是什么并修复它。

答案 2 :(得分:0)

我会调查java.util.concurrent Executor框架,特别是Future<T>界面。有了这些,你会从java.lang.Thread的变幻莫测中抽象出来,你可以很好地解决任务与运行方式的关系(无论是在一个单独的线程上,线程是来自池还是实例化在飞等等。)

至少,Future实例会为您提供isDoneisCancelled方法。

ExecutorServiceExecutor的子接口)为您提供了一些关闭任何未完成任务的方法。或者查看ExecutorService.awaitTermination(long timeout, TimeUnit unit)方法

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

}