问题标签 [threadpoolexecutor]

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 投票
2 回答
1884 浏览

java - 如何在不使用 `Executors.newSingleThreadScheduledExecutor` 的情况下使用单个线程创建`ScheduledThreadPoolExecutor`?

如何在ScheduledThreadPoolExecutor不使用 的情况下使用单线程创建一个Executors.newSingleThreadScheduledExecutor

我想这样做的原因是后面的调用返回一个实例DelegatedScheduledExecutorService而不是一个实例ThreadPoolExecutor,所以我尝试能够使用诸如getQueue()etc 之类的方法失败了。如果我可以直接创建一个ThreadPoolExecutor会有所帮助。

我想要的原因getQueue()是没有其他方法可以知道当前在执行程序中排队的任务的大小。

0 投票
0 回答
63 浏览

java - 将信息从 Runnable 传递给 ScheduledJobThreadExecutor.afterExecute

我正在安排定期任务并使用 ScheduledJobThreadExecutor。在执行 runnable 时,可能会发生一些需要我做出反应的事情,但它必须在任务完成后才会发生。

起初我以为我可以在 aftetExecute 中访问这些信息,因为我在那里得到了一个 Runnable(而且我可以查询它的状态)。原来它不是我提交的原始可运行文件!但是一个 ScheduledFutureTask,我找不到解开我原来的 Runnable 的方法。

我能做些什么?这种要求有成语吗?

谢谢!

0 投票
1 回答
678 浏览

java - 告诉 ThreadPoolExecutor 何时应该继续

我必须通过某个端口将一组文件发送到几台计算机。事实是,每次调用发送文件的方法时,都会计算目标数据(地址和端口)。因此,使用循环为每个方法调用创建一个线程,并在方法调用周围加上一个 BindException 的 try-catch 语句来处理程序试图使用已经在使用的端口的情况(不同的目标地址可能通过同一端口接收消息)告诉线程等待几秒钟然后重新启动重试,并继续尝试直到不抛出异常(成功执行传送)。我不知道为什么(尽管当我第一次看到它时我就猜到了),Netbeans 警告我在循环中休眠一个 Thread 对象不是最佳选择。这个链接到另一个 stackoverflow 帖子,看起来很有趣(我从未听说过ThreadPoolExecutor 类)。我一直在阅读该链接和 API 以尝试改进我的程序,但我还不太确定我应该如何在我的程序中应用它。有人可以帮忙吗?

编辑:重要代码:

0 投票
2 回答
1344 浏览

java - 始终获取唯一 ID 并将其释放以供重复使用

问题陈述是:-

每个线程都使用unique IDbetween 1 and 1000and 程序必须运行 for 60 minutes or more,在我检查时我run method得到了id as zero几次(if(id==0)),我把断点放在那个循环下,我不知道为什么?由于 availableExistingIds 的值在 1 到 1000 之间,所以我不知道这是从哪里来的zero is coming in my id

以下是程序开始的主要课程 -

更新:-

我想在这里使用 ArrayBlockingQueue ,这样当没有可用的 id 时它不会崩溃,而是等待一个可用。谁能建议我如何在这里使用它?

实施 BlockingQueue 后的代码更改。

我刚刚注意到的一件奇怪的事情是-在下面else if loop,如果您在下面看到我的上面的代码,run method那么command.getDataCriteria() is Previous它也被输入到else if block(which is for New)其中不应该发生在我正在做的事情.equals check?为什么会这样?

0 投票
1 回答
291 浏览

java - 多个线程修改相同的命令属性

问题陈述:-

在我下面的程序中,我使用ThreadPoolExecutor的是ArrayBlockingQueue.

每个线程每次都需要使用一个UNIQUE ID并且它必须运行60 minutes or more,所以60 minutes有可能所有这些ID's will get finished我都需要再次重用这些ID。所以我在ArrayBlockingQueue这里使用概念。

两种情况:-

  1. 如果command.getDataCriteria()包含Previous,那么每个线程总是需要使用UNIQUE ID between 1 and 1000并释放它以再次重用。
  2. 否则,如果command.getDataCriteria()包含New,则每个线程总是需要使用UNIQUE ID between 2000 and 3000并释放它以再次重用。

我目前在以下程序中面临什么问题-

我面临的一个问题是

  • 如果run method是那么它command.getDataCriteria()也会Previous进入else if block(which is for New)不应该发生的情况,对吗?我也在做一个.equals check?为什么会这样?可能是因为许多线程会同时启动并且之前已经修改了命令?

else if(command.getDataCriteria().equals("New")) {

如果多线程正在修改它,那么我该如何克服这个问题?无论发生什么问题,它都发生在run method. 任何建议都会有很大帮助,因为我长期以来一直坚持这一点。可能我们需要Synchronize the threads, so that no other thread should modify the command when another thread is trying to execute it.

runnable的实现(真正的单元级命令执行器)

我将感谢您对此的帮助。谢谢

getNextCommandToExecute method更新 -马特建议的代码

并且命令已在类的顶部声明为-

更新另一种方法:-

0 投票
2 回答
1647 浏览

java - 当 ThreadPoolExecutor 的所有任务完成执行那里的作业时插入数据库

问题定义:-

我需要在insert some values into Database所有任务ExecutorService完成后立即执行那里的工作。换句话说,我insert into database只能在所有任务都完成执行那里的作业时,因为我需要插入到数据库中的东西,取决于完成那里任务的所有线程。

那么我如何检查所有任务是否ExecutorService已完成执行然后开始插入数据库。

下面是我使用创建任务的代码ThreadPoolExecutor

我将用于插入的代码如下 -

所以我需要在所有任务完成执行后将这个 for 循环放在某个地方。

更新:-

所以像这样的东西-

0 投票
1 回答
150 浏览

threadpoolexecutor - 使用 ThreadPoolExecutor 时如何处理服务器崩溃?

我捕获了 RejectedExecutionException 并正确处理它。但是,我想知道当服务器/jvm突然崩溃时我应该如何捕捉和处理这种情况。有人可以帮我吗?

0 投票
1 回答
117 浏览

java - Java Webapp 执行器类

Java - webapp 通过 Executors 类执行线程作为以下代码的优势是什么,然后以固定池大小运行。

0 投票
5 回答
14151 浏览

java - 多线程与 ThreadPoolExecutor

我在我编写的许多应用程序中都使用了多线程。在阅读更多内容时,我遇到了ThreadPoolExecutors. 我无法区分这两种情况。

我仍然理解的是,当我有一个任务我想将一个任务分成多个小任务以利用 CPU 并更快地完成工作时,我应该使用多线程。ThreadPoolExecutor当我有一组任务并且每个任务可以相互独立运行时使用。

如果我错了,请纠正我。谢谢

0 投票
3 回答
5954 浏览

java - 使用 ExecutorService 并行处理作业

我正在编写一个需要处理大量 URL 的 java 程序。
每个 URL 将按顺序运行以下作业:下载、分析、压缩

我希望每个作业都有固定数量的线程,而不是让一个线程在每个 URL 上一次完成所有作业,以便所有作业在任何给定时间都有线程同时运行。

例如,下载作业将有多个线程来获取和下载 URL,一旦下载了其中一个 URL,它就会将其传递给分析作业中的线程,一旦完成,它就会传递给压缩作业中的线程等。

我正在考虑在 java 中使用 CompletionService,因为它会在完成后立即返回结果,但我不确定它是如何工作的,到目前为止我的代码如下所示:

我的问题是如何将下载的项目移动到分析作业并在那里完成工作而无需等待所有下载作业完成?我正在考虑为每个工作创建一个 CompletionService,这是一种可行的方法吗?如果没有,是否有更好的替代方法来解决这个问题?请提供例子。