0

我有许多线程正在运行,但我想执行一个特定的线程(TimerTask 的 run() 方法)以运行到它的完成,并且我不希望任何其他线程的任何中断。

我认为 synchronized(this) { } 不会确保它的完成。

请建议我一个正确的方法来做到这一点。

4

3 回答 3

0

一般来说,您不能阻止线程被“中断”,但这并不意味着计算将被取消;只是任何睡眠/等待操作都会引发异常。请参阅javadoc

如果您不想退出,您可以捕获 InterruptedException 并吞下它

于 2012-09-21T08:12:43.967 回答
0

工作完成后,您可以捕获InterruptedException并设置interrupt状态。

不可取消的任务

有些任务只是拒绝被打断,使它们不可取消。然而,即使是不可取消的任务也应该尝试保持中断状态,以防调用堆栈上的代码在不可取消的任务完成后对中断采取行动。清单 6 显示了一个方法,该方法在阻塞队列上等待直到项目可用,而不管它是否被中断。为了做一个好公民,它完成后在 finally 块中恢复中断状态,以免剥夺调用者的中断请求。(它不能更早地恢复中断状态,因为它会导致无限循环——BlockingQueue.take() 可以在进入时立即轮询中断状态,如果发现中断状态集则抛出 InterruptedException。)

public Task getNextTask(BlockingQueue<Task> queue) {
boolean interrupted = false;
try {
    while (true) {
        try {
            return queue.take();
        } catch (InterruptedException e) {
            interrupted = true;
            // fall through and retry
        }
    }
} finally {
    if (interrupted)
        Thread.currentThread().interrupt();
}
}
于 2012-09-21T08:17:11.967 回答
0

“实际上,我想要运行完成的一个关键线程并没有这样做,日志表明其他线程正在获取它们的时间片,并且之后关键不会继续。”

这听起来根本不像是操作系统调度问题。听起来更像是“关键线程”由于某些异常而被阻塞或退出。

重复运行表明关键线程在不同的执行点停止

  • 听起来比块状更异常。

如果我错了,并且您的关键线程被抢占,因为准备好的线程多于核心,您应该提高关键线程的优先级,使其不会被抢占,(或者只是减少盒子上的负载:) .

唯一的另一种可能性是您的线程正在使用大量数据并且您遇到很多页面错误。在这种情况下,获得更多 RAM、SSD 或两者兼而有之!

于 2012-09-24T09:41:09.963 回答