- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个表单的处理循环
while (true) {
doWork();
Thread.sleep(SLEEP_INTERVAL);
}
我想用它制作一个 Runnable
,它可以很好地与 ExecutorService
配合使用,并且会在调用 ExecutorService.shutdownNow()
时退出。
我想这样写:
public WorkerTask implements Runnable
{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
doWork();
try {
Thread.sleep(SLEEP_INTERVAL);
}
catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
简单的测试表明它至少看起来是有效的,因为任务被中断并退出,ExecutorService
将关闭,并且无论中断是在 doWork()
正在处理时还是在 sleep
期间到达,似乎都是如此。 (通过改变 doWork()
的工作量和 SLEEP_INTERVAL
的大小,我几乎可以控制中断发生的位置)。
但是当我用谷歌搜索时,我看到了使用 Thread.interrupted()
和 Thread.currentThread().isInterrupted()
的示例。我知道前者清除中断标志而后者离开它,但我还需要关心其他区别吗?
我还看到 Thread.currentThread().isInterrupted()
或 Thread.interrupted()
的结果存储在 volatile
变量中并且该变量用作 while
循环测试条件的版本。那只是一种风格还是有必要这样做?在我所写的内容中,我是否不得不担心在设置中断标志(无论是在线程处于 Activity 状态时被接收,还是通过我捕获 InterruptedException
并重新声明标志)和调用 Thread.currentThread().isInterrupted()
之间,某些东西会以某种方式清除中断标志在循环测试中?
最佳答案
我觉得你的代码没问题。引入一个额外的 volatile 变量会带来不必要的复杂性:中断状态可以完成这项工作。
在 Java 并发实践中,处理任务中断的推荐方法是抛出 InterruptedException
(如果任务是 Callable
而不是 Runnable
),或者确保设置了中断状态并尽快退出任务。你的代码做得很好。
关于java - 正确编写 ExecutorService.shutdownNow() 可以停止的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11698021/
我正在开发一款扑翼应用程序。在出现此错误之前,读取和写入FireStore数据库没有任何问题,但随后突然出现错误(如下所示),并阻止我读取或写入数据库。我一直在寻找答案,但不幸的是,我找不到任何可以解
我正在使用ExecutorService连接任务如下: ExecutorService executor = Executors.newSingleThreadExecutor(); Future f
根据方法 shutdownNow (ExecutorService) 的文档 There are no guarantees beyond best-effort attempts to stop
我正在使用 Executors 作为线程池,并提交任务。 executorService.shutdownNow 是否可以关闭所有任务,即使其中一些任务可能在对数据库或 Socket 的 I/O 调用
我有一个预定的执行程序服务设置,例如 class Test { private final ScheduledExecutorService executor; public Test
我创建了一个 future 任务并将其提交给 Executor。在 run() 方法中,我创建了一个 placementPlanner 对象。此类中的方法调用其他类。但是,当我调用 executor.
我正在运行一个高度并发的 Java 程序。当许多线程向执行程序服务提交任务时,主线程会在某个时刻调用 ExecutorService.shutdownNow()。 执行此操作后,我希望: 执行者服务不
此代码在 future.get() 上永久阻塞。我本以为会出现 CancellationException 或 InterruptedException。谁能解释一下? ExecutorService
正在学习 Java 1.5 中引入的 ExecutorService 以下示例似乎违反了预期行为: public static void main(String[] args) throws Inte
我有一个使用 Executors 创建多个线程的主线程 ExecutorService executor = Executors.newFixedThreadPool(4); 每个线程都有可能运行数小
ExecutorService 有一个方法 List shutdownNow() 哪个 returns a list of the tasks that were awaiting execution
ScheduledExecutorService从 ExecutorService 继承了两个方法, shutdown()和 shutdownNow() .它们的区别: shutdown initia
我有一个表单的处理循环 while (true) { doWork(); Thread.sleep(SLEEP_INTERVAL); } 我想用它制作一个 Runnable,它可以很好
package util.concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Ex
写在开头 面试官:“小伙子,线程池使用过吗,来聊一聊它吧!” 我:“好的,然后巴拉巴拉一顿输出之前看过的build哥线程池十八问...” 面试官满意的点了点头,紧接着问道:“那你知道如何优雅
当其中一个已在运行的任务抛出异常时,我需要取消所有已安排但尚未运行的 CompletableFuture 任务。 尝试了以下示例,但大多数时候 main 方法不会退出(可能是由于某种类型的死锁)。 p
我正在实现一个传输服务器程序,该程序从客户端获取消息(通过控制台输入),然后将其转发到某种邮箱。 为了允许不同客户端同时接收多个消息,我首先创建了一个实现Runnable 接口(interface)的
在第一个进程从 invokeAny 方法提供一些输出后,我立即使用 shutdownNow 关闭进程。但在输出中,即使在调用 shutdownNow() 之后,我也可以看到进程仍在完成流程中并完成其工
执行调用的 ExecutorService.shutdownNow() 后,该类卡在 Future.get() 方法处。我不知道我犯了什么错误。 该类创建固定线程池,并在 5 秒后超时。如果连续发生
我目前有一个 ExecutorService,我想要以下内容: 不应接受任何新任务。 当前任务仍应继续执行。 应返回所有当前排队的任务。 我面临的问题是 shutdown() 不会返回任何未执行的已提
我是一名优秀的程序员,十分优秀!