问题标签 [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.

0 投票
1 回答
1458 浏览

java - FutureTasks 和 CachedThreadPool 是如何工作的

我目前有执行以下操作的代码:

我遇到的问题是我让每个未来的任务打印出他们在计算时所花费的时间,所以例如在控制台上我会看到

但是总时间System.out.println(time taken)

我的印象是这些未来的任务是并行运行的,但从时间上看,它们似乎是一个接一个地运行。我是否正确使用了这个 API?

0 投票
2 回答
687 浏览

java - 帮助 java 线程或执行器:同时执行多个 MySQL 选择、插入和更新

我正在编写一个分析 MySQL 数据库的应用程序,我需要同时执行几个 DML;例如:

我声明了一组数据对象,每个对象都有自己的数据库连接,而数据库又调用了几种数据分析方法。问题是所有线程都使用相同的连接,因此所有任务都抛出异常:“锁定等待超时;尝试重新启动事务”

我相信有一种方法可以编写代码,使任何给定的对象都有自己的连接并独立于任何其他对象执行所需的任务。例如:

你能为我指出正确的方向吗?

谢谢

0 投票
6 回答
211486 浏览

java - 如何从线程池中获取线程 ID?

我有一个固定的线程池,我将任务提交到(限制为5 个线程)。如何找出这5 个线程中的哪一个执行我的任务(类似于“线程 #3 of 5正在执行此任务”)?

0 投票
3 回答
3261 浏览

java - 通过执行器重用java线程

我对以下内容感到困惑:
要在Java程序中使用线程,最简单的方法是扩展Thread类并实现runnable接口(或简单地实现runnable)。
开始线程的执行。我们必须调用线程的方法start(),然后调用线程的方法run()。于是线程开始了。
start() 方法(除非我错了)必须准确地调用,并且每个线程只调用一次。因此,线程实例不能被重用,除非 run 方法本身以某种方式运行在一些无限循环中,这有助于线程重用的自定义实现。
现在javadoc 链接文本

调用执行将重用以前构造的线程(如果可用)

我不明白这是如何实现的。我在执行器方法的执行方法中提供了我的自定义线程,例如

如何重用我委托给执行器框架的这个自定义线程?
是否允许 Executor 调用方法 start() 超过 1 次,而我们不能在我们的程序中?我是不是误会了什么?

谢谢你。

0 投票
2 回答
438 浏览

scala - 执行器运行时间超过超时值

这是scala的代码段。我将超时设置为 100 磨。在 10000 个循环中,有 106 个循环运行了 100 多个磨机而没有抛出异常。最大的一个甚至是 135 个工厂。为什么会发生这种情况?

0 投票
3 回答
252 浏览

java - 有没有一种简单的方法可以告诉 Java Executor 在给定时刻正在运行哪些任务?

我确信我可以一起破解一些东西,这将使我能够解决这个问题,但我希望有一个我只是想念的开箱即用的解决方案。我阅读了文档,但什么也没看到。

我的特定应用程序正在使用由 aThreadPoolExecutor支持的 a DelayQueue,尽管我不确定这是否重要。

谢谢!

0 投票
2 回答
295 浏览

java - 如果出现问题并且我想重试,使用同一个 Executor 将 Runnable 重新排入队列是否安全或可取?

我刚刚在我的runnable的run()方法中写了这段代码:

如您所见,如果任务无法获得数据库连接,它应该重新排队,进入它在运行之前所在的同一队列。

我认为这可能是安全的,但感觉很有趣,我只是想确保没有任何我遗漏的问题。

谢谢!

0 投票
3 回答
2426 浏览

java - 为什么我不能构造一个由 DelayQueue 支持的 ThreadPoolExecutor?

我正在尝试创建一个 ThreadPoolExecutor:

编译器说“找不到符号”:

但我不明白 -DelayQueue实现BlockingQueue,所以我不应该能够使用这个构造函数吗?

0 投票
1 回答
1122 浏览

java - 与其他线程争用的 ThreadPoolExecutor 线程

我正在对现有的 Java 应用程序进行增强。该应用程序是一个消息处理器,每天处理数百万条消息。它基本上是使用 Core Java 编写的,线程和队列是使用 Collection 类实现的。

在此应用程序中,某些类型的消息在单个线程中运行。我的任务是使应用程序的这个特定部分成为多线程以更快地处理消息,因为我们有双处理器。

由于我们使用的是 Java 5,所以我采用了使用 ThreadPoolExcecutor 的方法。我为每个客户端创建了处理器线程,以便可以在其自己的线程中处理特定线程的消息。处理器线程正在实现 Callable 接口,因为这将允许我检查未来对象是否完成前一个任务。

在初始化过程中,我将检查所有客户端并为每个客户端创建处理器线程,并使用它们的 id 作为唯一键将其存储在 map 中。为了跟踪以前提交的作业,我确实使用相同的 id 作为唯一键再次将未来对象保留在另一个地图中。

下面是我使用的一些代码片段:在主类中 -

处理器线程

问题

上述实现在我的测试环境中运行良好。但是,在生产环境(Edit#1 - Ubuntu、Linux Slackware、Java - 1.6.0_18)中,我们观察到应用程序的其他线程不通过这个新的 ThreadpoolExecutor 管理受到影响。即,他们的任务被延迟了几个小时。是因为 ThreadPoolExecutors 创建的线程正在占用全部资源或其他任何资源,而没有给其他线程机会。

使用 ThreadPoolExceutor 创建的新线程正在执行独立的任务,并且不会与其他线程争用资源。即,没有竞争条件场景。

在日志中,对于新的线程,我可以看到最多有 20 个线程在运行(corepoolsize)并且没有拒绝异常,即提交的数量在队列的范围内。

任何想法为什么会发生这种情况?

提前致谢。

0 投票
3 回答
1530 浏览

java - 如何以线程安全的方式访问 ThreadpoolExecutor 的底层队列

getQueue() 方法提供了对 ThreadPoolExecutor 中底层阻塞队列的访问,但这似乎并不安全。

遍历此函数返回的队列可能会错过 ThreadPoolExecutor 对队列所做的更新。

“方法 getQueue() 允许访问工作队列以进行监视和调试。强烈建议不要将此方法用于任何其他目的。”

如果你想遍历 ThreadPoolExecutor 使用的 workQueue,你会怎么做?还是有替代方法?

这是……的延续。 为生产者消费者问题的变体选择数据结构

现在,我正在尝试多生产者多消费者,但我想使用一些现有的线程池,因为我不想自己管理线程池,而且我想要在 ThreadPoolExecutor 完成执行某些任务时回调以及检查的能力以线程安全的方式“进行中的事务”数据结构。