问题标签 [executorservice]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - Android“错过”使用 ScheduledExecutorService 定期执行线程
我有一个 android 应用程序,它反复从周围的 wifi 网络收集指纹(出于科学原因,不侵犯任何人的隐私)。
无论如何,想象一下我有一个可以完成这项工作的函数,它被称为scanWifi()。我最初想这样开始:
可悲的是,这只在手机插入时才能可靠地工作。如果它被拔掉并在那里放置了一段时间,它不会每分钟运行我的 scanWifi() 函数。有时单次调用 scanWifi() 之间会有几分钟的间隔。
我也尝试使用 Timer/TimerTask 做同样的事情,但结果同样很差。
到目前为止,唯一似乎或多或少可靠的事情是将其发布到处理程序并重复调用它,如下所示:
为什么会这样?CPU 是否处于休眠状态并因此错过了预定的执行?我在我的应用程序中持有部分唤醒锁。
java - 使用 ExecutorService 产生的结果。哪一堂课?
我希望我能写下类/接口名称,但我没有……
在查看 JDK javadocs 时,我看到了对类/接口的引用,其目的是收集和使用ExecutorService
(完成Futures<T>
的 s)产生的结果,可能在系统的其他地方。当时我在心里记下了它,因为它非常适合我需要的东西,但我似乎无法从舌尖说出课程的名称。
有人知道我指的是什么吗?
java - 通过执行器重用java线程
我对以下内容感到困惑:
要在Java程序中使用线程,最简单的方法是扩展Thread类并实现runnable接口(或简单地实现runnable)。
开始线程的执行。我们必须调用线程的方法start(),然后调用线程的方法run()。于是线程开始了。
start() 方法(除非我错了)必须准确地调用,并且每个线程只调用一次。因此,线程实例不能被重用,除非 run 方法本身以某种方式运行在一些无限循环中,这有助于线程重用的自定义实现。
现在javadoc
链接文本
说
调用执行将重用以前构造的线程(如果可用)
我不明白这是如何实现的。我在执行器方法的执行方法中提供了我的自定义线程,例如
如何重用我委托给执行器框架的这个自定义线程?
是否允许 Executor 调用方法 start() 超过 1 次,而我们不能在我们的程序中?我是不是误会了什么?
谢谢你。
java - 关于Java线程的一些问题
首先是一点背景。我在 NetBeans 中收到警告,告诉我不要在构造函数中启动新线程。我已经读过这样做的原因是因为新线程可能会启动并尝试引用该对象在构造函数实际完成创建对象之前启动线程。
1.)为了实验而不是使用new Thread
,thread.start()
我试过ExecutorService
了,我没有收到任何警告。 这是否意味着如果我使用可以在构造函数中创建和启动新线程ExecutorService
?
2.)另外,如果我有ExecutorService
一个缓存线程池的形式,将通过标准方法创建一个新线程new Thread
并thread.start()
从缓存池中拉出一个线程(或者如果一个线程不可用,则导致它创建一个)还是这些线程完全独立于缓存线程池?
java - 使用 ExecutorService 有什么好处?
使用将 a 传递给构造函数ExecutorService
的运行线程有什么好处?Runnable
Thread
java - 发生了一件有趣的事情...... ExecutorCompletionService
我有一个用 java 编写的应用程序,它需要找到网络上所有可访问的主机。
我用InetAddress.isReachable()
2000 毫秒的超时来执行此操作。
我查找当前本地机器的 IP 地址,并据此尝试访问以 1-255 结尾的其他 IP 地址,而丢失了本地机器的 IP 地址。
这一切都工作正常单线程,只是需要很长时间,因为大多数 IP 地址不存在,因为它们不存在,所以用完 2 秒超时。
为了加快速度(并在行动中尝试并发性 :: Brian Goetz),我尝试使用Future
等Callable
。
这一切也很顺利。
但是我想用ExecutorCompletionService
它来给我的用户一个响应速度更快的应用程序,这样他们就可以看到结果,因为他们可以使用
在具有以下配置的单处理器机器上运行此程序会导致四个可访问主机中的一个被识别:
在四核机器上将其更改为这样也使其无法检测到所有可访问的主机:
通过将InetAddress.isReachable()
超时更改为 10 秒,使最后一个配置正常工作。
此外,通过在四核机器上按如下方式更改配置,也使其在 2 秒超时下工作:
我是否遗漏了一些非常明显的东西,为什么会发生这种情况?
是什么阻止InetAddress.isReachable(2000)
了检测我网络上所有可访问的主机?
为什么尝试运行多个InetAddress.isReachable()
调用会失败?
java - 通过 executorservice 进行顺序事件处理
我有一个事件队列要处理。线程将事件添加到队列中。
我创建了一个可运行的任务,该任务在该run
方法中执行处理事件所需的所有操作。
我已经宣布了一个Executors.newCachedThreadPool();
和我execute
每个任务。
我的问题是,如果我调用execute
执行器,我的代码将获得下一个事件并通过执行器运行下一个可运行对象。我的目的是仅在上一个任务结束后才处理队列中的下一个事件。
我怎么知道上一个任务是否完成,以便我知道我可以再次调用handleNextEvent?
让任务更新一些状态字段是个好主意吗?
谢谢
java - 我应该限制我拥有的执行者的数量吗?
我有一个 Java 项目,我需要在其中并行运行。我和执行者一起做这件事。问题是,我需要在很多地方使用执行器。我应该倾向于传递一些执行器来完成工作(暂时忘记限制全局线程数)还是最好在我需要的地方创建执行器?
java - ScheduledExecutorService 工作线程在 FutureTask.cancel(true) 之后保持中断状态
我有一个任务,我计划通过ScheduledThreadPoolExecutor.scheduleAtFixedRate(task, rate, ...)定期运行。用户可以手动取消此任务,这会调用ScheduledFuture.cancel(true)。出于某种原因,可能取决于他们何时取消此任务,工作线程(执行程序用于运行我的任务)在我的任务的 run() 方法退出后似乎保持中断状态。
尽管工作线程(从池中获取并重用)会在使用现有钩子(通过ThreadPoolExecutor.beforeExecute()或ThreadPoolExecutor.afterExecute())开始新任务之前清除其中断状态。但它在默认实现中不这样做。
我有两个问题:
- 工作线程怎么会处于设置了中断状态的状态?
- 为什么默认实现在开始新任务之前不清除中断状态?