1

我必须在新线程上调用函数 3rd 方模块。据我所见,如果一切顺利,调用要么很快完成,要么永远挂起锁定线程。什么是启动线程并进行调用并等待几秒钟的好方法,如果线程仍然活着,那么假设它被锁定,杀死(或停止或放弃)线程而不使用任何不推荐使用的方法。

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

}
4

3 回答 3

2
public void stop() {
        if (thread != null) {
           thread.interrupt();
        }
    }

请参阅有关如何停止线程的链接,它很好地涵盖了该主题

于 2010-06-17T19:20:46.487 回答
1

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

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

当您的应用程序卡住时,运行 jstack(或使用调试器)。试着找出是什么阻碍了这个功能并修复它。

于 2010-06-17T19:28:56.343 回答
0

我会研究java.util.concurrent Executor框架,特别是Future<T>接口。有了这些,您就可以从 java.lang.Thread 的变幻莫测中抽象出来,并且您可以很好地解耦任务的运行方式(无论是在单独的线程上,线程来自池还是在飞等)

至少,Future 实例为您提供了isDone方法isCancelled

ExecutorService(的子接口Executor) 为您提供了一些关闭任何未完成任务的方法。或者查看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();
        }

}
于 2010-06-17T19:18:07.627 回答