Java:停止运行时间过长的线程?

Dr.*_*ing 4 java multithreading

说我有这样的事情

public void run(){
    Thread behaviourThread = new Thread(abstractBehaviours[i]);
    behaviourThread.start();
}
Run Code Online (Sandbox Code Playgroud)

我想等到abstractBehaviours [i] run方法已经完成或运行5000毫秒.我怎么做?behaviourThread.join(5000)似乎没有这样做afaik(我的代码有问题,我已经把它归结为那个).

所有抽象的abstractBehaviour类当然都是Runnable.我不想在每个run方法中实现它,因为它看起来很难看并且有很多不同的行为,我宁愿在调用/执行线程中使用它并且只执行一次.

解决方案?第一次做这样的线程.谢谢!

编辑:因此中断解决方案将是理想的(需要对AbstractBehaviour实现进行最小的更改).但我需要线程停止,如果它已经完成或已经过了5000毫秒,所以类似下面的东西将无法工作,因为线程可能在父线程中的while循环之前完成.合理?任何解决这个问题的方法,我都很乐意从明显启动线程的线程中做到这一点.

long startTime = System.currentTimeMillis();
behaviourThread.start();
while(!System.currentTimeMilis - startTime < 5000);
behaviourThread.interrupt();
try {
    behaviourThread.join();
} catch (InterruptedException e1) {
    e1.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

编辑:nevermind我看到有一个Thread.isAlive()方法,我认为都解决了

Ste*_*n C 6

执行此操作的最佳方法是使用线程中断机制.工作线程/ Runnable需要定期调用Thread.interrupted()以查看是否该停止.等式的第二部分是一个单独的线程需要Thread.interrupt()在5000毫秒过后调用工作线程.

使用线程中断的优点(通过使用标志的定制解决方案)包括:

  • interrupted()状态始终可用于当前线程.您不需要传递对象句柄或使用单例.
  • 中断将取消阻止某些阻塞IO和同步请求.定制的解决方案无法做到这一点.
  • 第三方Java应用程序和库可能会受到尊重Thread.interrupt().

编辑 - 作为评论者指出,您可以使用Thread.interrupted()或测试当前线程是否被中断Thread.currentThread().isInterrupted().两种方法的主要区别在于前者清除了中断的标志,但后者没有.