Tag: executorservice

如何在multithreading环境中更好地使用ExecutorService?

我需要创建一个库,在其中我将有同步和异步方法。 executeSynchronous() – 等到我有结果,返回结果。 executeAsynchronous() – 立即返回一个Future,如果需要,可以在其他事情完成后处理。 我的图书馆的核心逻辑 客户将使用我们的库,他们将通过传递DataKey构建器对象来调用它。 然后,我们将使用该DataKey对象构造一个URL,并通过执行它来对该URL进行HTTP客户端调用,然后在我们将响应作为JSON字符串返回之后,我们将通过创建将该JSON字符串发送回我们的客户DataResponse对象。 有些客户会调用executeSynchronous() ,有些可能会调用executeAsynchronous() ,这就是为什么我需要在我的库中单独提供两个方法。 接口: public interface Client { // for synchronous public DataResponse executeSynchronous(DataKey key); // for asynchronous public Future executeAsynchronous(DataKey key); } 然后我有我的DataClient实现上面的Client接口: public class DataClient implements Client { private RestTemplate restTemplate = new RestTemplate(); // do I need to have all threads as […]

Java:如何从运行的线程中获取完成的线程来拾取任务

我正在使用具有不同运行时间的任务的multithreading应用程序。 当一个线程完成时,是否有办法从仍在运行的线程中接管某些任务? 这是一个例子。 我用5个线程启动程序,每个程序有50个任务。 当最快的运行线程完成时,另一个线程仍然有40个任务要完成。 如何让完成的线程从另一个线程中获取20个任务,因此每个线程继续工作20个,而不是等待正在运行的线程完成剩下的40个?

invokeAll()不愿意接受Collection <Callable >

我不明白为什么这段代码不能编译 ExecutorService executor = new ScheduledThreadPoolExecutor(threads); class DocFeeder implements Callable {….} … List list = new LinkedList(); list.add(new DocFeeder(1)); … executor.invokeAll(list); 错误消息是: The method invokeAll(Collection<Callable>) in the type ExecutorService is not applicable for the arguments (List) list是DocFeeder的Collection ,它实现了Callable – 发生了什么?!

ExecutorService,按顺序执行任务但从池中获取线程

我正在尝试构建ExecutorService的实现,我们称之为SequentialPooledExecutor ,具有以下属性。 SequentialPooledExecutor所有实例共享同一个线程池 对SequentialPooledExecutor的同一实例的调用按SequentialPooledExecutor执行。 换句话说,实例在开始处理其队列中的下一个任务之前等待当前正在执行的任务的终止。 我目前正在自己​​实施SequentialPooledExecutor ,但我想知道我是否正在重新发明轮子。 我查看了ExecutorService不同实现,例如Executors类提供的那些,但我找不到符合我要求的实现。 你知道我现有的实现是否缺失,还是我应该继续自己实现界面? 编辑: 我认为我的要求不是很清楚,让我们看看我是否可以用其他的话来解释它。 假设我有一系列会话,比如1000个(我之前称之为执行程序实例的东西)。 我可以向会话提交任务,我希望保证提交给同一会话的所有任务都按顺序执行。 但是,属于不同会话的任务应该彼此没有依赖关系。 我想定义一个执行这些任务的ExecutorService ,但是使用有限数量的线程,比方说200,但确保在同一个会话中的前一个任务完成之前不启动任务。 我不知道是否存在已经存在的任何内容,或者我是否应该自己实现这样的ExecutorService 。

ThreadPoolExecutor与ArrayBlockingQueue

我开始从Java Doc中读取更多关于ThreadPoolExecutor的内容,因为我正在我的一个项目中使用它。 那么任何人都可以解释一下这条线实际意味着什么吗? – 我知道每个参数代表什么,但我想从这里的一些专家那里以更一般/非人的方式理解它。 ExecutorService service = new ThreadPoolExecutor(10, 10, 1000L, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(10, true), new ThreadPoolExecutor.CallerRunsPolicy()); 更新: –问题陈述是: – 每个线程使用介于1和1000之间的唯一ID,程序必须运行60分钟或更长时间,因此在60分钟内,所有ID都可能完成,因此我需要再次重用这些ID。 所以这是我用以上执行器编写的下面的程序。 class IdPool { private final LinkedList availableExistingIds = new LinkedList(); public IdPool() { for (int i = 1; i <= 1000; i++) { availableExistingIds.add(i); } } public synchronized Integer getExistingId() { return […]

“由于故障导致的线程终止”是指什么?

ExecutorService的javadoc有时指的是Thread因“失败”而终止的情况。 但是,目前尚不清楚这是指什么样的失败。 例如, 单线程执行程序文档说明了这一点 如果由于在关闭之前执行期间的故障而导致该单个线程终止,则如果需要执行后续任务,则新线程将取代它 我原以为这种情况可能发生在Exception或RuntimeException的情况下,但似乎并非如此。 运行以下代码似乎给出了相同的线程名称和线程ID。 ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> { System.out.println(“Hello from ” + Thread.currentThread().getName()+ ” ” + Thread.currentThread().getId()); throw new NullPointerException(“Test”); }); executor.submit(() -> { System.out.println(“Hello 2 from ” + Thread.currentThread().getName() + ” ” + Thread.currentThread().getId()); }); 此代码的输出是: Hello from pool-1-thread-1 12 Hello 2 from pool-1-thread-1 12 即使在NullPointerException的情况下,似乎也在重用相同的线程。 那么Javadoc指的是什么样的“失败”?

线程终止时的Java ExecutorService回调

我使用缓存线程池ExecutorService来运行一些异步后台任务。 我已经提供了我的ThreadFactory,它将线程分发给ExecutorService(只要它需要它们)。 我对缓存线程池的理解是,在线程空闲60秒后,它由ExecutorService终止。 当我的线程即将被终止时,我想执行一些状态清理。 实现这一目标的最佳方法是什么? ExecutorService不容易为线程的生命周期提供钩子。 我不想关闭我的ExecutorService – 对于在它们到来时运行任务很有用。 ExecutorService executor = Executors.newCachedThreadPool(new MyThreadFactory()); // Do some work executor.submit(new MyCallable()); // Need a way for the ExecutorService to notify me when it is about to // terminate my thread – need to perform some cleanup 谢谢, Shreyas

在ExecutorService中hibernate一个线程(Java / Clojure)

我在clojure程序中创建了相当多的线程: (import ‘(java.util.concurrent Executors)) (def *pool* (Executors/newCachedThreadPool)) (defn do-something [] ; work Thread/sleep 200 ; repeat) (dotimes [i 10000] (.submit *pool* do-something)) 对我来说,JVM之间已经有一段时间了,我基本上在想这里是否有任何反对在Executor正在执行的函数内使用sleep或yield的论据? 如果我理解正确,在这种情况下,我的每个工人都有自己的线程,因此不应该有任何副作用。 如果Executor使用的是FixedThreadPool: (Executors/newFixedThreadPool 1000) 事情变得更加复杂,因为线程在工作完成之前不会返回到池中,这意味着如果线程处于hibernate状态,其他排队的工作人员将需要更长的时间才能完成。 我对这种情况下的线程理解是否正确? (注意:我怀疑我的设计确实是错误的,但只是想确保我在正确的页面上)

Java Executor服务线程池

如果我使用Executor框架在java中创建一个包含10个线程的固定大小的线程池: private final ExecutorService pool; pool = Executors.newFixedThreadPool(10); 然后尝试提交10个以上的任务(例如,12个任务); for (int i = 0 ; i < 12 ; i++) { pool.execute(new Handler(myRunnable)); } 额外任务会发生什么(根据12个任务的例子,额外的两个任务)? 在线程完成工作之前它们会被阻塞吗?

使用Executors服务在Java中创建固定大小线程池的最佳方法

我使用Java中的Executors框架为multithreading应用程序创建线程池,我有一个与性能相关的问题。 我有一个可以在实时或非实时模式下工作的应用程序。 如果它是实时的,我只是使用以下内容: THREAD_POOL = Executors.newCachedThreadPool(); 但是,如果它不是实时的,我希望能够控制我的线程池的大小。 要做到这一点,我正在考虑两个选项,但我并不真正理解其中的差异,哪个会更好。 选项1是使用简单的方法: THREAD_POOL = Executors.newFixedThreadPool(threadPoolSize); 选项2是创建我自己的ThreadPoolExecutor如下所示: RejectedExecutionHandler rejectHandler = new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { try { executor.getQueue().put(r); } catch (Exception e) {} } }; THREAD_POOL = new ThreadPoolExecutor(threadPoolSize, threadPoolSize, 0, TimeUnit.SECONDS, new LinkedBlockingQueue(10000), rejectHandler); 我想了解使用更复杂的选项2的优点是什么,以及我是否应该使用另一个数据结构而不是LinkedBlockingQueue ? 任何帮助,将不胜感激。