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()方法,我认为都解决了
执行此操作的最佳方法是使用线程中断机制.工作线程/ Runnable需要定期调用Thread.interrupted()以查看是否该停止.等式的第二部分是一个单独的线程需要Thread.interrupt()在5000毫秒过后调用工作线程.
使用线程中断的优点(通过使用标志的定制解决方案)包括:
interrupted()状态始终可用于当前线程.您不需要传递对象句柄或使用单例.Thread.interrupt().编辑 - 作为评论者指出,您可以使用Thread.interrupted()或测试当前线程是否被中断Thread.currentThread().isInterrupted().两种方法的主要区别在于前者清除了中断的标志,但后者没有.