Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有共享队列的执行器_Java_Concurrency - Fatal编程技术网

Java 具有共享队列的执行器

Java 具有共享队列的执行器,java,concurrency,Java,Concurrency,我有一个任务生成器和几个硬件资源来执行它们 所以,我尝试使用共享队列创建执行器 BlockingQueue<Runnable> queue; ExecutorService executor1 = new ThreadPoolExecutor(poolSize1, poolSize1, 0L, TimeUnit.MILLISECONDS, queue, threadFactory); ExecutorService executor2 = new ThreadPoolExecutor

我有一个任务生成器和几个硬件资源来执行它们 所以,我尝试使用共享队列创建执行器

BlockingQueue<Runnable> queue;
ExecutorService executor1 = new ThreadPoolExecutor(poolSize1, poolSize1, 0L, TimeUnit.MILLISECONDS, queue, threadFactory);
ExecutorService executor2 = new ThreadPoolExecutor(poolSize2, poolSize2, 0L, TimeUnit.MILLISECONDS, queue, threadFactory);
ExecutorService executor3 = new ThreadPoolExecutor(poolSize3, poolSize3, 0L, TimeUnit.MILLISECONDS, queue, threadFactory);
阻塞队列;
ExecutorService Executor 1=新的ThreadPoolExecutor(poolSize1、poolSize1、0L、TimeUnit.millides、queue、threadFactory);
ExecutorService Executor 2=新的ThreadPoolExecutor(poolSize2,poolSize2,0L,TimeUnit.millides,queue,threadFactory);
ExecutorService executor3=新的ThreadPoolExecutor(poolSize3,poolSize3,0L,TimeUnit.millides,queue,threadFactory);
并且(只需尝试)将任务添加到队列中。放置(任务),而不是特定的执行者n.execute(任务) 但是,execurer直到调用execute(task)才创建线程

那么,我需要一个执行器的实现?在子执行器的任何空闲线程上运行任务。 也许您知道可以使用的解决方案/库


这不是一个平衡器。我不管任务从哪里开始。让它在队列中等待,直到它被一个免费的处理程序接受为止

我希望您手动实现它:

    BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(500);

    IntStream.range(0, 10).forEach(i -> {
      Thread t = new Thread(() -> {
        while (true) {
          try {
            queue.take().run();
          } catch (InterruptedException e) {
            break;
          }
        }
      });
      t.setDaemon(true);
      t.setName("worker-"+i);
      t.start();
    });

    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));

    Thread.sleep(1000);

    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));

    Thread.sleep(1000);

附加线程将等待队列中的新项目。

我希望您手动实现它:

    BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(500);

    IntStream.range(0, 10).forEach(i -> {
      Thread t = new Thread(() -> {
        while (true) {
          try {
            queue.take().run();
          } catch (InterruptedException e) {
            break;
          }
        }
      });
      t.setDaemon(true);
      t.setName("worker-"+i);
      t.start();
    });

    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));

    Thread.sleep(1000);

    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));
    queue.add(() -> System.out.println(Thread.currentThread().getName()));

    Thread.sleep(1000);

p.S.线程将等待队列中的新项目。

这不是您想要实现的目标吗?为什么需要几个执行器?“几个硬件资源”应该转换为几个工作线程,而不是executors@talex,我有以前由一个远程处理程序执行的任务,现在它的资源不足,我想如何通过添加更多服务器来增加容量。@Sharon Ben Asher,将逻辑移到ThreadFactory是个好主意。@lunicon在这种情况下,您可以使用Matthew Ivanoff答案中的想法。这不是您想要实现的目标吗?为什么需要几个执行器?“几个硬件资源”应该转换为几个工作线程,而不是executors@talex,我有以前由一个远程处理程序执行的任务,现在它的资源不足,我想如何通过添加更多服务器来增加容量。@Sharon Ben Asher,将逻辑移到ThreadFactory是个好主意。@lunicon在这种情况下,您可以使用Matthew Ivanoff answer中的idea。您的解决方案假定您需要立即创建所有线程。ExecutorService仅在没有足够的空闲线程时创建这些线程。您的解决方案假定您需要立即创建所有线程。ExecutorService仅在没有足够的免费服务时创建它们。