Tag: executorservice

如何在Tomcat停止时停止执行程序线程?

我通过创建固定数量的线程来执行HTTP GET数据检索来使用执行程序服务。 executorService = ExecutorServiceFactory.getInstance().getExecutorService(Config.getInstance().getNumberOfThreads(), “ThreadExecutor_”+UIDFactory.getInstance().createSessionID()); executorService.execute(new Retrieve(data)); private class Retrieve implements Runnable{ private Vector data; public WADORetrieve(Vector data) { this.data = data; } @Override public void run() { for(int i=0;i<data.length;i++){ fetch(data[i]); } } } 当Tomcat停止时,我们收到此错误: 严重:Web应用程序[/ viewer]似乎已经启动了一个名为[ThreadExecutor_5161616156]但未能阻止它的线程。 这很可能造成内存泄漏。 这是一个真正的问题吗? 如果没有这些服务错误,我该怎么做才能正常停止tomcat。

Java – 将工作分割为多个线程

我提出了以下问题:出于性能原因,我需要跨多个线程拆分工作,但我不确定采取什么方法。 首先,我将提供的任务应该返回一个值并获取一个参数。 此外,主要方法(执行主要工作,而不是static main() )已经在单独的线程上运行并定期调用。 此外,此方法必须在某个时刻等待所有线程完成然后继续。 一种方法(对我来说最明显)是将每个作业安排在一个单独的线程上并将结果存储在类变量中: public Object result1, result2; public void mainMethod() throws InterruptedException { final Thread thread = new Thread(new Runnable() { @Override public void run() { result1 = expensiveMethod(“param1”); } }); final Thread thread1 = new Thread(new Runnable() { @Override public void run() { result2 = expensiveMethod(“param2”); } }); thread1.join(); thread.join(); […]

是否使用invokeAll或submit – java Executor服务

我有一个场景,我必须为同一个callable异步执行5个线程。 据我了解,有两种选择: 1)使用submit(Callable) ExecutorService executorService = Executors.newFixedThreadPool(5); List<Future> futures = new ArrayList(); for(Callable callableItem: myCallableList){ futures.add(executorService.submit(callableItem)); } 2)使用invokeAll(Callable集合) ExecutorService executorService = Executors.newFixedThreadPool(5); List<Future> futures = executorService.invokeAll(myCallableList)); 应该是什么首选方式? 与其他产品相比,它们中的任何产品是否存在任何劣势或性能影响?

在ExecutorService任务中停止无限循环

import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; class Task implements Callable { public String call() throws Exception { String s = “initial”; try { System.out.println(“Started..”); /*for (int i=0;i<10000;i++) { if (i % 2 == 0) { System.out.println("Even"); } }*/ boolean flag = true; while(flag) { } […]

完成所有ExecutorService任务后,程序不会立即终止

我将一堆可运行的对象放入ExecutorService: // simplified content of main method ExecutorService threadPool = Executors.newCachedThreadPool(); for(int i = 0; i < workerCount; i++) { threadPool.execute(new Worker()); } 我希望我的程序/流程在所有工人完成后立即停止。 但根据我的日志,它需要另外20-30秒才能发生。 工人们没有分配任何资源,事实上,他们现在什么都不做。 不要误会我的意思,这对我来说不是一个至关重要的问题,我只是想了解发生了什么,我想知道这是否是正常行为。

Java执行程序:等待任务终止。

我需要提交一些任务,然后等待所有结果,直到所有结果都可用。 它们中的每一个都向Vector添加一个String (默认情况下是同步的)。 然后我需要为Vector中的每个结果启动一个新任务,但是只有当所有先前的任务都停止完成它们的工作时我才需要这样做。 我想使用Java Executor,特别是我尝试使用Executors.newFixedThreadPool(100)来使用固定数量的线程(我有一个可变数量的任务,可以是10或500)但我是执行器和我不知道如何等待任务终止。 这就像我的程序需要做的伪代码: ExecutorService e = Executors.newFixedThreadPool(100); while(true){ /*do something*/ for(…){ } for each String in result{ } } 我不能做e.shutdown,因为我有一段时间(真的)我需要重用executorService … 你能帮助我吗? 你能给我一个关于java执行器的指南/书吗?

生产者/消费者工作队列

我正在努力实现我的处理管道的最佳方法。 我的制作人将作品提供给BlockingQueue。 在消费者方面,我轮询队列,包装我在Runnable任务中获得的内容,并将其提交给ExecutorService。 while (!isStopping()) { String work = workQueue.poll(1000L, TimeUnit.MILLISECONDS); if (work == null) { break; } executorService.execute(new Worker(work)); // needs to block if no threads! } 这不理想; 当然,ExecutorService有自己的队列,所以真正发生的事情是我总是完全耗尽工作队列并填充任务队列,随着任务的完成,队列会慢慢排空。 我意识到我可以在生产者端排队任务,但我真的不愿意这样做 – 我喜欢我的工作队列的间接/隔离是愚蠢的字符串; 这真的不是制片人的任何事情会发生在他们身上。 迫使生产者对Runnable或Callable进行排队会打破抽象,恕我直言。 但我确实希望共享工作队列代表当前的处理状态。 如果消费者没有跟上,我希望能够阻止生产者。 我喜欢使用Executors,但我觉得我正在与他们的设计作斗争。 我可以部分喝Kool-ade,还是我必须吞下它? 我是否在拒绝排队任务方面做错了? (我怀疑我可以设置ThreadPoolExecutor来使用1任务队列并覆盖它的执行方法来阻止而不是拒绝队列满,但这感觉很糟糕。) 建议?

一旦我的线程中断,我怎么能中断RestTemplate调用?

我需要创建一个库,在其中我将具有同步和异步function。 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(); private ExecutorService executor = Executors.newFixedThreadPool(10); // for synchronous call […]

在ThreadPoolExecutor中使用InheritableThreadLocal – 或者 – 不重用线程的ThreadPoolExecutor

我试图使用InheritableThreadLocal和ThreadPoolExecutor 。 这会分解,因为ThreadPoolExecutor为每个池重用线程(毕竟它是一个池),这意味着InheritableThreadLocal不能按预期工作。 现在这个问题对我来说显而易见,但追踪却特别狡猾。 我使用InheritableThreadLocal以便几个顶级进程中的每一个都有自己的数据库连接以及它产生的任何子进程。 我不只是使用一个共享连接池,因为每个顶级进程在提交到数据库和/或准备大量反复使用的PreparedStatements之前,将使用其连接进行大量的多步骤工作。 我在这些顶级进程之间使用共享的ThreadPoolExecutor ,因为某些行为需要被门控。 虽然我可能有4个顶级进程在运行,但我一次只能有一个进程写入数据库(或者系统需要访问其他一些共享资源)。 因此,我将让顶级进程创建一个Runnable并将其发送到共享的ThreadPoolExecutor ,以确保在整个系统中同时运行不超过一个(或两个或三个)。 问题是因为ThreadPoolExecutor重用其池的线程,所以InheritableThreadLocal将获取在该池中运行的原始值,而不是将Runnable发送到ThreadPoolExecutor的顶级进程中的值。 有没有办法强制ThreadPoolExecutor的工作池使用创建Runnable而不是在重用线程池的上下文中的进程上下文中的InheritableThreadLocal值? 或者,是否有任何ThreadPoolExecutor实现,每次启动一个新的Runnable时都会创建一个新线程? 出于我的目的,我只关心将同时运行的线程的数量设置为固定大小。 有没有其他解决方案或建议人们让我完成我上面描述的内容? (虽然我意识到我可以通过将类数据库连接从类传递到子线程到子线程来解决问题,就像某种社区自行车一样,我想避免这种情况。) 还有一个关于StackOverflow, InheritableThreadLocal和线程池的问题也解决了这个问题。 但是,该问题的解决方案似乎是它对于InheritableThreadLocal来说是一个糟糕的用例,我不认为这适用于我的情况。 谢谢你的任何想法。

java Fork / Join池,ExecutorService和CountDownLatch

我们在java中有三种不同的multithreading技术 – Fork / Join池,Executor Service和CountDownLatch Fork / Join pool ( http://www.javacodegeeks.com/2011/02/java-forkjoin-parallel-programming.html ) Fork / Join框架旨在使分而治之的算法易于并行化。 这种类型的算法非常适合于可以分为两个或更多相同类型的子问题的问题。 他们使用递归将问题分解为简单的任务,直到这些变得足够简单直接解决。 然后组合子问题的解决方案以给出原始问题的解决方案 ExecutorService是一个扩展Executor类并表示异步执行的接口。 它为我们提供了管理结束和检测异步任务进度的机制。 invokeAll() :执行给定的任务,返回一个Futures列表,保存状态和结果全部完成。 Future.isDone()对于返回列表的每个元素都为true。 CountDownLatch 🙁 http://examples.javacodegeeks.com/core-java/util/concurrent/countdownlatch-concurrent/java-util-concurrent-countdownlatch-example/ ) CountDownLatch用于同步,以允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。 我的假设: 在这两种替代方案中,只有在完成所有任务/线程后才能知道最终结果。 这三种选择是互补的还是互补的 ?