java确保线程完成而不会中断

时间:2012-09-21 08:04:27

标签: java concurrency

我有很多线程在运行,但是我想执行一个特定的线程(一个TimerTask的run()方法)来运行它的完成,我不想让任何其他线程中断。

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

请建议我这样做的正确方法。

3 个答案:

答案 0 :(得分:0)

通常,您无法阻止线程被“中断”,但这并不意味着计算将被取消;只是任何睡眠/等待操作都会抛出异常。 请参阅javadoc

如果您不想退出,可以catch the InterruptedException and swallow it

答案 1 :(得分:0)

您的工作完成后,您可以抓住InterruptedException并设置interrupt状态。

Noncancelable tasks

  

有些任务只是拒绝被打断,使它们无法取消。但是,即使是非可执行任务也应该尝试保留中断状态,以防在调用堆栈上方的代码在非可执行任务完成后想要对中断起作用。清单6显示了一个等待阻塞队列直到某个项可用的方法,无论它是否被中断。为了成为一个好公民,它在完成后恢复最终块中的中断状态,以免剥夺呼叫者的中断请求。 (它无法更早恢复中断状态,因为它会导致无限循环 - 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();
}
}

答案 2 :(得分:0)

  

'实际上我想运行一个关键线程来完成它   没有这样做,日志建议其他线程正在得到他们的   时间片和关键时刻不会继续。'

这听起来不像是OS调度问题。听起来更像是“关键线程”因为某些例外而被阻止或退出。

  

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

  • 听起来比块状更加异常。

如果我错了,并且你的关键线程被抢占了,因为线程比线程更准备线程,你应该提高关键线程的优先级,使其不被抢占,(或者只是减少加载框:)

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