我想恢复中断线程的工作,请让我知道一些可能的解决方案。
class RunnableDemo implements Runnable
{
public void run()
{
while(thread.isInterrupted())
{
try{}
catch(Exception e){ //exception caught}
}
}
}
如果捕获异常,线程会中断,但即使捕获异常,我也希望线程继续工作,所以请向我建议一些方法来解决此问题。
提前致谢
中断是您在编写线程时选择遵守的事情。因此,如果您不希望线程被中断,请不要检查中断状态并继续。
唯一需要 try/catch 语句(关于线程中断)的情况是在调用抛出InterruptedException
的阻塞方法时。然后,您需要避免让该异常停止线程的工作。
答案是肯定的。。。您应该考虑一下这是否是一种合适的行为方式。线程中断是一件有用的事情,选择不遵守它可能会让代码用户感到烦恼。
我编写了一个可重用的代码来获取此功能,线程可以在其中暂停和恢复。请在下面找到代码。您可以扩展PausableTask并覆盖task()方法:
public abstract class PausableTask implements Runnable{
private ExecutorService executor = Executors.newSingleThreadExecutor();
private Future<?> publisher;
protected volatile int counter;
private void someJob() {
System.out.println("Job Done :- " + counter);
}
abstract void task();
@Override
public void run() {
while(!Thread.currentThread().interrupted()){
task();
}
}
public void start(){
publisher = executor.submit(this);
}
public void pause() {
publisher.cancel(true);
}
public void resume() {
start();
}
public void stop() {
executor.shutdownNow();
}
}
希望这有帮助。有关更多详细信息,请查看此链接或在评论部分给我喊叫。http://handling-thread.blogspot.co.uk/2012/05/pause-and-resume-thread.html
只有当有人调用该线程的 interrupt() 方法时,线程才会中断,而不是因为在你思考时运行线程时抛出了其他一些随机异常。
当线程的 interrupted() 方法被调用时,如果线程处于阻塞操作的中间(例如。IO 读取)。
当抛出 InterruptedException 时,你应该知道中断状态被清除了,所以下次你在线程中调用 isInterrupted() 时会给你 false(即使你只是处理了 InterruptedException)
在编写线程代码时请记住这一点。如果你不明白我在说什么,停止编码多线程,去读一些关于Java并发的书。
一个警告:如果你的线程在调用第三方库时处理 InterruptedException,那么你不一定知道库对它的反应(即,当你的程序继续使用它们有意义时,它是否让库对象处于某种状态?
一些开发人员(包括一些库开发人员)错误地认为中断意味着"关闭程序",他们所关心的只是关闭文件等;而不是库是否可以继续使用。
试试看,但是如果你正在编写代码来控制航天器或核反应堆或其他东西,那么你可能需要做一些额外的工作来真正找出库的作用。
正如其他人已经说过的,通常中断是取消任务的正确方法。如果您确实需要实现不可取消的任务,至少请确保在完成不可中断工作后恢复线程的中断状态:
public void run() {
boolean interrupted = false;
try {
while (true) {
try {
callInterruptibleMethod();
} catch (InterruptedException ex) {
interrupted = true;
// fall through and retry
}
}
} finally {
if (interrupted) {
// restore interruption state
Thread.currentThread().interrupt();
}
}
}
(摘自《Java并发实践》一书)