相关疑难解决方法(0)

FixedThreadPool vs CachedThreadPool:两个邪恶中较小的一个

所以我有一个程序产生线程(~5-150)执行一堆任务.最初我使用的是FixedThreadPool因为这个类似的问题表明它们更适合长寿命的任务,而且由于我对多线程的知识非常有限,我认为线程的平均寿命(几分钟)" 长寿 ".

但是,我最近添加了生成其他线程的功能,这样做超过了我设置的线程限制.在这种情况下,最好猜测并增加我可以允许的线程数或切换到一个CachedThreadPool所以我没有浪费线程?

初步尝试它们,似乎没有什么区别,所以我倾向于选择CachedThreadPool公正以避免浪费.但是,线程的生命周期是否意味着我应该选择一个FixedThreadPool并且只处理未使用的线程?这个问题使得看起来这些额外的线程没有浪费,但我希望澄清.

java multithreading executorservice java.util.concurrent threadpool

85
推荐指数
3
解决办法
6万
查看次数

如何为CompletableFuture :: supplyAsync选择Executor

CompletableFuture::supplyAsync(() -> IO bound queries)

如何为CompletableFuture :: supplyAsync选择Executor以避免污染ForkJoinPool.commonPool().

有许多选项Executors(newCachedThreadPool,newWorkStealingPool,newFixedThreadPool等)

在这里阅读了关于新ForkJoinPool的内容

如何为我的用例选择合适的?

java executorservice java-8 threadpoolexecutor completable-future

14
推荐指数
1
解决办法
4726
查看次数

java中的负载均衡线程池

我正在寻找一个负载均衡的线程池到目前为止没有成功.(不确定负载平衡是否是正确的措辞).让我解释一下我试图实现的目标.

第1部分:我有乔布斯,有8到10个单一任务.在6核CPU上,让8个线程并行处理这个任务,这似乎可以提供最佳的性能.当一个任务准备就绪时,另一个任务就可以开始.完成所有十项任务后,完成整个工作.通常,工作在30到60秒内完成.

第二部分:有时,不幸的是,这项工作需要两个多小时.由于必须计算的数据量,这是正确的.坏的是,在job1运行时没有其他工作可以启动(假设所有线程具有相同的持续时间),因为它正在使用所有线程.

我的第一个想法:拥有12个线程,并行允许最多三个作业.但是:这意味着,当只有一份工作时,这项工作就没有完全实现.

我正在寻找一种解决方案,在没有其他工作的情况下为作业1提供全部CPU能力.但是当另一个工作需要在另一个工作时启动时,我希望将CPU功率分配给这两个工作.当第三或第四个工作出现时,我希望cpu电源公平地分配给所有四个工作.

我赞成你的答案......

提前致谢

java multithreading pool threadpool

8
推荐指数
1
解决办法
3340
查看次数

Java Servlet中的ExecutorService

我需要在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)

java concurrency multithreading servlets java-ee

5
推荐指数
1
解决办法
5262
查看次数

未来总是创建一个新线程吗?

假设我这样做:

(future
  (do-the-thing))
Run Code Online (Sandbox Code Playgroud)

我是否可以保证,无论做什么(do-the-thing)

  • 将创建一个全新的线程,而不是从池中获取一个线程或类似的东西?
  • 除了(do-the-thing)会在那个新线程上运行之外别无他物?
  • 一旦(do-the-thing)在该新线程上执行,该线程将终止?

如果不是,在什么情况下这些假设是错误的?

multithreading future clojure

5
推荐指数
1
解决办法
1279
查看次数

覆盖线程池中线程的中断方法

说我有这个:

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)

java multithreading executorservice threadpool

5
推荐指数
1
解决办法
70
查看次数

如何优化线程数以加快处理速度

我读过很多类似的问题.但是我对答案不太满意.

我想构建一个算法,根据平均速度调整线程数.

让我们说当我引入一个新线程时,任务执行的平均速度会增加,这意味着新线程是好的.然后算法应该尝试添加另一个线程......直到达到最佳线程数.......

算法也应该跟踪平均速度.如果在某些时候平均速度显着下降,让我们说10%(因为任何原因,例如我打开一个不同的应用程序或其他),那么算法应终止一个线程,看看速度是否上升...

也许这样的API存在.请给我任何指示或任何代码示例如何实现这样的算法

谢谢 !

java multithreading

4
推荐指数
2
解决办法
1103
查看次数

newFixedThreadPool()vs newCachedThreadPool()

如果newCachedThreadPool()每个创建一个线程池,根据需要创建新线程,但会在它们可用时重用先前构造的线程,而在newFixedThreadPool(int size)指定大小的情况下创建指定大小的线程池.

为什么没有newFixedThreadPool(int size)newCachedThreadPool()线程池仅在需要时创建新线程并将线程限制为大小的方式实现?

对上述内容的任何澄清都非常有用.

java multithreading executorservice threadpool threadpoolexecutor

3
推荐指数
1
解决办法
2001
查看次数