Tag: 线程

在Java中向线程池中添加新任务之前等待任务完成的最佳方法?

我想使用类似ThreadPoolExecutor的东西来管理在可用线程上运行一堆任务。 这些任务都是相同的类型,但处理不同的帐户。 这些帐户的新任务可以定期添加,我希望它能够检查并且不允许新任务开始,直到同一帐户的旧任务已经完成。 最好的方法是什么? 例 帐户“234”的任务已启动(通过ThreadPoolExecutor.execute()) 帐户“238”的任务已启动(通过ThreadPoolExecutor.execute()) 帐户“234”的新任务已创建但未添加执行,因为第一个“234”任务未完成(检查此问题的最佳方法是什么?) 帐户“238”的任务完成 帐户“238”的新任务启动(通过ThreadPoolExecutor.execute()),因为当前没有为该帐户运行 最好的方法是什么? 只需要在等待/睡眠()中检查Runnable中的某些检查变量,以便完成“234”的第一个任务吗? 或者有更好的解决方案吗?

哪个更快? 更多可运行的工作更少,或者更少的可运行工作? (ExecutorService的)

我试图弄清楚如何从multithreading应用程序中获得最大性能。 我有一个我创建的线程池,如下所示: ExecutorService executor = Executors.newFixedThreadPool(8); // I have 8 CPU cores. 我的问题是,我应该将工作分成只有8个runnables / callables,这与线程池中的线程数相同,还是应该将它分成1000000 runnables / callables呢? for (int i = 0; i < 1000000; i++) { Callable worker = new MyCallable(); // Each worker does little work. Future submit = executor.submit(worker); } long sum = 0; for (Future future : list) sum += […]

Android线程池管理多个蓝牙handeling线程?

所以我有我的Android蓝牙应用程序,它有主机和客户端。 问题是,因为我正在进行多个连接,所以我需要一个线程来处理每个连接。 这都是milk’n’cookies,所以我想我会把所有线程都放在一个数组中。 一个小小的研究表明,更好的方法是使用线程池,但我似乎无法理解其工作原理。 此外,它实际上甚至可以在一个数组中保存线程吗?

引起:java.lang.OutOfMemoryError:Java堆空间

我的目标: 我想为1000个用户运行我的应用程序。 现在 我试图为100个用户运行。 在应用程序运行期间,我想为每个用户执行一些过程,每个用户至少需要一个小时,因此我每个用户使用一个线程。 错误 Caused by: java.lang.OutOfMemoryError: Java heap space 我试图找出这意味着什么,但我不确定如何解决它。 有谁能够帮我?

WireMock可以播放来自多个域的请求吗?

我正在构建一个Dockerised记录播放系统来帮助我记录网站,所以我可以设计一个本地版本的刮刀,而不是真实的东西。 这意味着我不会使用自动请求来淹没网站,并且具有额外的优势,即我不需要连接到网络即可工作。 我在内部使用了基于Java的WireMock,它使用Wget从站点擦除队列中进行记录。 我正在使用WireMock API从它记录的映射中读取各种片段信息。 但是,我从映射响应中发现,似乎没有记录域信息(除非它偶然出现在响应头中)。 请参阅__admin/mappings的以下响应: { “result”: { “ok”: true, “list”: [ { “id”: “794d609f-99b9-376d-b6b8-04dab161c023”, “uuid”: “794d609f-99b9-376d-b6b8-04dab161c023”, “request”: { “url”: “/robots.txt”, “method”: “GET” }, “response”: { “status”: 404, “bodyFileName”: “body-robots.txt-j9qqJ.txt”, “headers”: { “Server”: “nginx/1.0.15”, “Date”: “Wed, 04 Jan 2017 21:04:40 GMT”, “Content-Type”: “text/html”, “Connection”: “keep-alive” } } }, { “id”: “e246fac2-f9ad-3799-b7b7-066941408b8b”, “uuid”: “e246fac2-f9ad-3799-b7b7-066941408b8b”, […]

为什么以下执行程序服务java Thread程序没有关闭?

import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.config.SocketConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import […]

Java从ExecutorService设置回调

我有一个fixedThreadPool,我用它来运行一堆工作线程来实现具有许多组件的任务的并行执行。 当所有线程都完成后,我使用方法(getResult)检索它们的结果(相当大)并将它们写入文件。 最终,为了节省内存并能够看到中间结果,我希望每个线程在完成执行后立即将其结果写入文件,然后释放其内存。 通常,我会在run()方法的末尾添加代码。 但是,此类中的某些其他对象也会调用这些线程,但不要让它们将结果写入文件 – 而是使用其结果执行其他计算,最终将其写入文件。 所以,我想知道是否可以使用ExecutorService将回调函数附加到线程完成事件。 这样,我可以立即检索其结果并在该场景中释放内存,但在其他场景中使用这些线程时不会破坏代码。 这样的事情可能吗?

newFixedThreadPool与newSingleThreadExecutor的性能问题

我正在尝试对客户端代码进行基准测试。 所以我决定编写一个multithreading程序来对我的客户端代码进行基准测试。 我想测量下面方法需要多少time (95 Percentile) attributes = deClient.getDEAttributes(columnsList); 下面是我编写的用于对上述方法进行基准测试的multithreading代码。 我在两个场景中看到很多变化 – 1)首先,使用20 threads并running for 15 minutesmultithreading代码。 我得到95百分位数为37ms 。 我正在使用 – ExecutorService service = Executors.newFixedThreadPool(20); 2)但如果我使用以下方式运行同一个程序15 minutes – ExecutorService service = Executors.newSingleThreadExecutor(); 代替 ExecutorService service = Executors.newFixedThreadPool(20); 当我用newFixedThreadPool(20)运行我的代码时,我得到95百分位为7ms ,这比上面的数字小。 任何人都可以告诉我这样的高性能问题可能是什么原因 – newSingleThreadExecutor vs newFixedThreadPool(20) 通过这两种方式,我运行我的程序15 minutes 。 以下是我的代码 – public static void main(String[] args) { try […]

具有corePoolSize 0的ThreadPoolExecutor在任务队列已满之前不应执行任务

我正在经历Java Concurrency In Practice并且陷入8.3.1线程创建和拆解主题。 以下脚注警告将corePoolSize保持为零。 开发人员有时会试图将核心大小设置为零,这样工作线程最终会被拆除,因此不会阻止JVM退出,但这可能会导致在不使用a的线程池中出现一些看似奇怪的行为。用于工作队列的SynchronousQueue(如newCachedThreadPool所做的那样)。 如果池已经是核心大小,则ThreadPoolExecutor仅在工作队列已满时才创建新线程。 因此,在队列填满之前 , 提交给具有任何容量和核心大小为零的工作队列的线程池的任务将不会执行 ,这通常不是所希望的。 所以为了validation这一点,我写了这个程序,它不能像上面说的那样工作。 final int corePoolSize = 0; ThreadPoolExecutor tp = new ThreadPoolExecutor(corePoolSize, 1, 5, TimeUnit.SECONDS, new LinkedBlockingQueue()); // If the pool is already at the core size if (tp.getPoolSize() == corePoolSize) { ExecutorService ex = tp; // So tasks submitted to a thread pool with […]

Java Cached线程池和线程本地

我有一个关于java和并发的问题。 假设我有一个名为a的ThreadLocal变量。 我使用CachedThreadPool来获取新线程。 当一个线程被重新调用时,ThreadLocal变量会发生什么? 它保持相同的值(因为它是一个相同的线程)或它开始为空(好像线程是新的)? 谢谢