所以我有一个程序产生线程(~5-150)执行一堆任务.最初我使用的是FixedThreadPool因为这个类似的问题表明它们更适合长寿命的任务,而且由于我对多线程的知识非常有限,我认为线程的平均寿命(几分钟)" 长寿 ".
但是,我最近添加了生成其他线程的功能,这样做超过了我设置的线程限制.在这种情况下,最好猜测并增加我可以允许的线程数或切换到一个CachedThreadPool所以我没有浪费线程?
初步尝试它们,似乎没有什么区别,所以我倾向于选择CachedThreadPool公正以避免浪费.但是,线程的生命周期是否意味着我应该选择一个FixedThreadPool并且只处理未使用的线程?这个问题使得看起来这些额外的线程没有浪费,但我希望澄清.
java multithreading executorservice java.util.concurrent threadpool
CompletableFuture::supplyAsync(() -> IO bound queries)
如何为CompletableFuture :: supplyAsync选择Executor以避免污染ForkJoinPool.commonPool().
有许多选项Executors(newCachedThreadPool,newWorkStealingPool,newFixedThreadPool等)
我在这里阅读了关于新ForkJoinPool的内容
如何为我的用例选择合适的?
java executorservice java-8 threadpoolexecutor completable-future
我正在寻找一个负载均衡的线程池到目前为止没有成功.(不确定负载平衡是否是正确的措辞).让我解释一下我试图实现的目标.
第1部分:我有乔布斯,有8到10个单一任务.在6核CPU上,让8个线程并行处理这个任务,这似乎可以提供最佳的性能.当一个任务准备就绪时,另一个任务就可以开始.完成所有十项任务后,完成整个工作.通常,工作在30到60秒内完成.
第二部分:有时,不幸的是,这项工作需要两个多小时.由于必须计算的数据量,这是正确的.坏的是,在job1运行时没有其他工作可以启动(假设所有线程具有相同的持续时间),因为它正在使用所有线程.
我的第一个想法:拥有12个线程,并行允许最多三个作业.但是:这意味着,当只有一份工作时,这项工作就没有完全实现.
我正在寻找一种解决方案,在没有其他工作的情况下为作业1提供全部CPU能力.但是当另一个工作需要在另一个工作时启动时,我希望将CPU功率分配给这两个工作.当第三或第四个工作出现时,我希望cpu电源公平地分配给所有四个工作.
我赞成你的答案......
提前致谢
我需要在java servlet中同时执行一些任务(主要是使用请求参数和读取数据调用多个外部URL)并在几秒钟内向用户发送响应.我正在尝试使用ExecutorService来实现相同的目的.我需要在doGet方法中的每个用户请求中创建四个FutureTasks.每个任务运行大约5-10秒,对用户的总响应时间约为15秒.
在Java servlet中使用ExecutorService时,能否建议以下哪种设计更好?
1)(为每个请求创建newFixedThreadPool并尽快关闭它)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
}
protected void doGet(HttpServletRequest request,HttpServletResponse response)
{
myThreadPool = Executors.newFixedThreadPool(4);
taskOne = myThreadPool.submit();
taskTwo = myThreadPool.submit();
taskThree = myThreadPool.submit();
taskFour = myThreadPool.submit();
...
...
taskOne.get();
taskTwo.get();
taskThree.get();
taskFour.get();
...
myThreadPool.shutdown();
}
public void destroy()
{
super.destroy();
}
}
Run Code Online (Sandbox Code Playgroud)
2)(在Servlet Init期间创建newFixedThreadPool并在servlet destroy上关闭它)
public class MyTestServlet extends HttpServlet
{
ExecutorService myThreadPool = null;
public void init()
{
super.init();
//What should be the …Run Code Online (Sandbox Code Playgroud) 假设我这样做:
(future
(do-the-thing))
Run Code Online (Sandbox Code Playgroud)
我是否可以保证,无论做什么(do-the-thing),
(do-the-thing)会在那个新线程上运行之外别无他物?(do-the-thing)在该新线程上执行,该线程将终止?如果不是,在什么情况下这些假设是错误的?
说我有这个:
class Queue {
private static ExecutorService executor = Executors.newFixedThreadPool(1);
public void use(Runnable r){
Queue.executor.execute(r);
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是 - 如何定义池中使用的线程,特别是想要覆盖池中线程的中断方法:
@Override
public void interrupt() {
synchronized(x){
isInterrupted = true;
super.interrupt();
}
}
Run Code Online (Sandbox Code Playgroud) 我读过很多类似的问题.但是我对答案不太满意.
我想构建一个算法,根据平均速度调整线程数.
让我们说当我引入一个新线程时,任务执行的平均速度会增加,这意味着新线程是好的.然后算法应该尝试添加另一个线程......直到达到最佳线程数.......
算法也应该跟踪平均速度.如果在某些时候平均速度显着下降,让我们说10%(因为任何原因,例如我打开一个不同的应用程序或其他),那么算法应终止一个线程,看看速度是否上升...
也许这样的API存在.请给我任何指示或任何代码示例如何实现这样的算法
谢谢 !
如果newCachedThreadPool()每个创建一个线程池,根据需要创建新线程,但会在它们可用时重用先前构造的线程,而在newFixedThreadPool(int size)指定大小的情况下创建指定大小的线程池.
为什么没有newFixedThreadPool(int size)以newCachedThreadPool()线程池仅在需要时创建新线程并将线程限制为大小的方式实现?
对上述内容的任何澄清都非常有用.
java multithreading executorservice threadpool threadpoolexecutor
java ×7
threadpool ×4
clojure ×1
concurrency ×1
future ×1
java-8 ×1
java-ee ×1
pool ×1
servlets ×1