2017-10-16 124 views
0

是否有任何类型的Runnable,Callable或Thread能够在任何时间内停止它?具有在任何时间段内停止该线程的线程

我写了这样的事情

public class ThreadRunner { 

private ExecutorService threadPoolExecutor; 

ThreadRunner() { 
    threadPoolExecutor = Executors.newSingleThreadExecutor(); 
} 

public void startThread(String endPoint, ProgressBar progressBar) { 
    Runnable task =() -> { 
     // some code which saves images from URL (1230 images) and updates progress bar 
    }; 

    threadPoolExecutor.execute(task); 

} 

public void stopThread() { 
    threadPoolExecutor.shutdownNow(); 
} 
} 

线程中运行正常,图像被保存,更新进度条,但是当我想停止线程通过调用(或者甚至暂停节省如果可能的过程) ThreadRunner类的方法 - 没有任何反应。

我做错了什么?或者很可能 - 我做错了什么?

+0

[The Java Tutorials:Interrupts](https://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html) –

+0

在ExecutorService上读取JavaDoc。shutdownNow()'它应该变得更清楚:该调用将导致执行程序服务关闭,它将_try_中断已运行的任务,但“任何无法响应中断的任务可能永远不会终止”(来自JavaDoc)。这一切都取决于你的任务如何反应中断。假设你的任务运行一个循环,你可以在循环体中检查'Thread.isInterrupted()'。 – Thomas

+0

有没有可能do..while循环(放置在Runnable中)不想让线程关闭? –

回答

0

是否有任何种类的Runnable,Callable或Thread能够在任何时间内停止它?

你可以自己实现这样的事情,但是没有可用的通用支持,除非你计算了长期不推荐使用的Thread.stop()方法。在任何情况下,您都不应该使用这些方法,但请阅读their API docs以了解它们为什么会被弃用以及您可以做什么的讨论。你可以找到一个更长版本的讨论in Java's technical notes

底线是您希望能够停止的计算需要定期检查一些共享变量或内置条件以确定是否这样做。当你希望线程停止时,你可以设置该变量,如果你需要阻塞,直到它停止,那么你就可以使用它。在某些情况下,线程可以帮助它检查变量(或被中断本身可以作为终止条件)。这个用户面对的结束可以用一个方法来包装。

在任何情况下,ExecutorService不能给你一个这方面的处理。请求这样的服务关闭将阻止它分派任何更多的任务,但是没有安全的通用机制来强制过早关闭已经运行的任务。

0

一旦开始,线程将运行,直到退出Runnable.run()。由于几个问题,你不应该使用Thread.stop()Thread.interrupt()

相反,您将不得不实施自己的退出/暂停逻辑。几点建议:

  • 对于停止线程,可以设置一个布尔变量shouldExit。在你的线程中,每隔一段时间检查一下这个变量,当它变成true时,做“返回”或者中断for/while循环。现在,从另一个线程设置此变量应使下载程序退出。如有必要,您应该使用​​块环绕对此变量的访问,以防止任何竞争条件。
  • 对于暂停线程,您可以使用类似的方法。当您将某个变量设置为true时(例如isPaused),通过进入Object.sleep()使线程反应。这样,它在睡眠期间不会消耗任何CPU。然后,您可以使用另一个线程中的Object.notify()将休眠线程“踢出”睡眠。您在这里也需要一个​​块。