用Java进行线程化

时间:2009-05-16 08:16:27

标签: java multithreading interrupt

我试图让我的主线程产生一个新线程,并在一段时间后,引发中断标志。当它这样做时,生成的线程应该看到该标志并自行终止。

主线程看起来像这样:

final Thread t = new Thread()
{
    @Override
    public void run()
    {
        f();
    }
};
t.start();
try
{
    t.join(time);
    t.interrupt();
    if(t.isAlive())
    {
        t.join(allowance);
        if(t.isAlive())
            throw new Exception();
    }
}
catch(Exception e)
{
    System.err.println("f did not terminate in the alloted time");
}

产生的线程在其代码中散布着一堆以下内容:

if(Thread.interrupted()) return;

当我处于调试模式时,一切都很完美。中断标志由主线程引发,并由生成的线程捕获。但是,在常规运行模式下,无论我设置了多长时间,生成的线程似乎都没有收到中断标志。

有谁知道我做错了什么?

注意:我正在使用Ubuntu,而且我对Linux的所有内容都是新手。问题可能出在操作系统上吗?我没有在任何其他操作系统上测试代码。

4 个答案:

答案 0 :(得分:4)

以下是我的猜测:

  • 当主线程调用t.interrupt();时,t线程已经完成执行。
  • 当主线程在t线程中调用t.interrupt();时,不再需要检查interrupted()标志。
  • 运行代码后会出现异常吗?您是否在“津贴”时间之后获得了代码中的异常,或者您获得了ThreadInterruptedException之类的其他类似内容?尝试编写被捕异常的消息......

答案 1 :(得分:0)

看起来f()中没有达到Thread.interrupted()调用。

您在调试和运行模式中看到的不同行为很可能是由于竞争条件造成的。

答案 2 :(得分:0)

你有Thread.interrupted()的嵌套检查吗?该方法清除中断的标志,因此第二个调用返回false。您可以使用isInterrupted()代替。

答案 3 :(得分:0)

我建议您考虑使用ExecutorService来设计这样做,并可以通过其他方式为您提供帮助。

ExecutorService service = Executors.newCachedThreadPool();
Future<ResultType> future = service.submit(new Callable<ResultType() {
   public ResultType call() throws Exception {
      // do soemthing
      return (ResultType) ...;
   }
);
// do anything you like until you need to result.
try {
   ResultType result = future.get(5, TimeUnit.SECONDS);
} catch (TimeoutException timedOut) {
  // handle exception
  // cancel the task, interrupting if still running.
  result.cancel(true);
} catch (ExecutionException taskThrewAnException) {
  // handle exception
}
// when you have finished with the service, which is reusable.
service.shutdown();