问题标签 [executors]
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.
java - 执行程序线程未终止
我正在使用 Executors.newFixedThreadPool(100) 方法。单个命令执行需要大约 20 个线程。执行命令 5-6 次后,应用程序停止响应。我的线程正在实现 Callable。
我怀疑,该线程在完成后不会终止。我还调用了 shutdown() 来终止线程。
谁能告诉我,当我使用 get() 方法来检索线程的结果时,它是被终止(意味着它从队列中删除)还是它仍然存在于队列中,池用于存储线程。
java - 如何进入 FutureTask 执行状态?
我有一个singleThreadExecutor,以便按顺序执行我提交给它的任务,即一个接一个的任务,没有并行执行。
我有 runnable 是这样的
}
例如,当我将 MyRunnable 的三个实例提交给上述单线程执行器时,我希望第一个任务正在执行,并且由于 Thread.sleep 在 TIMED_WAITING 中有其执行线程(我可能对具体的错误状态)。其他两个任务不应该分配线程来执行它们,至少在第一个任务完成之前是这样。
所以我的问题是如何通过 FutureTask API 获得这种状态,或者以某种方式到达正在执行任务的线程(如果没有这样的线程,那么任务正在等待执行或挂起)并获得它的状态,或者可能通过一些其他手段?
FutureTask 只定义了 isCanceled() 和 isDone() 方法,但不足以描述 Task 的所有可能执行状态。
java - 生产者消费者 - 使用 Executors.newFixedThreadPool
我对生产者-消费者模式的理解是,它可以使用生产者和消费者之间共享的队列来实现。生产者将工作提交到共享队列,消费者检索并处理它。也可以由生产者直接提交给消费者来实现(生产者线程直接提交给消费者的执行者服务)。
现在,我一直在研究提供线程池的一些常见实现的 Executors 类。根据规范,newFixedThreadPool 方法“重用在共享无界队列上运行的固定数量的线程”。他们在这里谈论的是哪个队列?
如果Producer直接向consumer提交任务,是不是ExecutorService的内部队列包含了Runnables的列表?
或者它是中间队列,以防生产者提交到共享队列?
可能是我错过了重点,但有人可以澄清一下吗?
java - 我需要澄清 ThreadpoolExecutor beforeExecute 和 afterExecute 挂钩
我在我的应用程序中使用线程池。我已将 TreadPoolExecutor 子类化并覆盖了方法 beforeExecute、afterExecute 和出于统计目的而终止。
我还实现了自己的 ThreadFactory 并覆盖了 newThread 方法。
我知道线程池包装类创建了十几个“可调用”任务并调用 invokeAll 方法来获取结果。在每个任务中都有一个接口对象。基本 X 对象实现了接口并且已经被子类化了很多次。所以当线程池被执行时,它会启动对象 X 的子对象。
从代码的角度来看,它看起来有点像:
我的问题是,当我调用 before 和 after 执行挂钩时,如何检索可调用任务中保存的信息?或者我想我想做的是给线程池的每个线程一个特定的名称,这可能吗?
我可以清楚地看到隐藏在 Runnable 对象/FutureTask/callable 中的调试模式下的 Eclipse 变量视图中的信息。
我不明白为什么我只需要用 Runnable 对象覆盖方法(beforeExecute、afterExecute)而没有 Callable 对象(因为我需要检索结果)。我缺少或不明白的东西?也许我需要子类 FutureTask 不确定?
谢谢你的帮助,
java - Java Executor,在队列底部/末尾添加新任务
我希望有一个 Executor 可以选择是在队列的顶部还是底部添加新任务。实现这一目标的最简单方法是什么?
java - 使用 ScheduledExecutorService 时在何处对计划任务执行最终清理
任务是实现一个非常简单的计算“云”。云实例(“引擎”)应该定期向主管发送保持活动消息(“命令”)。我已经使用以下任务实现了这一点:
使用scheduleAtFixedRate()安排执行。我正在使用shutdownNow()进行优雅(ish)关闭,以避免必须保留对长时间运行任务的显式引用。
是否有任何“干净”的方式来执行特定于任务的清理(关闭DatagramSocket
)?或者,在计划的运行之间保留一个 DatagramSocket 实例是否有意义,或者我可以每次都创建一个新实例?
java - 如何管理执行者
在我的实践中,我开发的软件变得庞大而复杂的情况并不少见,并且它的各个部分都以自己的方式使用执行器。从性能的角度来看,最好在每个部分使用不同的线程池配置。但从可维护性和代码可用性的角度来看,如果所有与线程、并发性和 CPU 利用率相关的东西都保存在某个集中位置并进行配置,那将是更可取的。
让每个需要并发执行或调度的类创建自己的线程池是不行的,因为很难控制它们的生命周期和线程总数。
创建某种ExecutorManager并在应用程序周围传递一个线程池也不行,因为根据任务的类型和提交率,工作队列和线程池大小的不适当配置组合会损害性能非常糟糕。
所以问题是:有一些通用的方法可以解决这个问题吗?
java - ExecutorService 仅运行最近添加的 Callable
我有一个单线程执行器服务,用于通过网络获取一些数据。
当用户在搜索框中输入时,我正在排队可能的网络任务。我想要的是取消所有以前的请求,只排队并立即运行最新的请求。
我目前的方法是在调用 super 之前覆盖 execute() 和 submit() 方法并清除队列。
对此有什么想法吗?
java - 我应该在 Future或我自己的 FutureTask上调用 cancel(true)
我有一个自定义类,我在该类上对方法MyFutureTask extends FutureTask<Void>
执行了一些代码。done()
我使用了一个调用submit(new MyFutureTask())
它的 ExecutorService。
现在我可以保留对调用提交后返回的引用Future<?>
,但是当我调用取消时,该isCancelled()
方法永远不会返回 true。
我应该忽略Future<?>
返回的对象,而是使用MyFutureTask
并调用cancel(true)
它吗?
那么Future<?>
对象有什么用呢?
编辑:Java 中的 Future 和 FutureTask 有什么区别?从这个线程我明白了区别。
除了默认的取消行为,我还想尝试停止正在进行的网络调用,所以我想我将使用 FutureTask 的路由是正确的。有人可以确认吗?
java - 带有执行器的线程池的 POC(概念证明)
任何人都可以用例子解释我们为什么要使用线程池。
从理论上讲,我知道线程池与 Executors 的使用。
我已经阅读了许多教程,但是我没有得到任何关于我们为什么要使用线程池的实际示例,它可以是 newFixedThreadPool 或 newCachedThreadPool 或 newSingleThreadExecutor
在可扩展性和性能方面。
如果有人向我解释有关性能和可扩展性的示例吗?