Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Multithreading_Threadpool - Fatal编程技术网

具有竞争队列的Java线程池

具有竞争队列的Java线程池,java,multithreading,threadpool,Java,Multithreading,Threadpool,我想使用Java固定线程池的扩展。我有N组可运行的对象,我想与它们竞争资源。但是,我希望使用的线程总数保持不变。这里概述了我希望这项工作的方式 分配一个具有N个线程和M个队列的对象 在队列m上调度作业n 有一个指向第一个队列的指针 重复 A.如果当前使用的线程数达到最大值,请稍候。 B弹出当前队列上的作业 C将指针移到一个队列上(或从最后一个队列移到第一个队列) 首先,这样的事情已经存在了吗?第二,如果不是这样的话,我会对编写自己的线程感到紧张,因为我知道编写自己的线程池可能很危险。有人能给我举

我想使用Java固定线程池的扩展。我有N组可运行的对象,我想与它们竞争资源。但是,我希望使用的线程总数保持不变。这里概述了我希望这项工作的方式

  • 分配一个具有N个线程和M个队列的对象
  • 在队列m上调度作业n
  • 有一个指向第一个队列的指针 重复 A.如果当前使用的线程数达到最大值,请稍候。 B弹出当前队列上的作业 C将指针移到一个队列上(或从最后一个队列移到第一个队列)

  • 首先,这样的事情已经存在了吗?第二,如果不是这样的话,我会对编写自己的线程感到紧张,因为我知道编写自己的线程池可能很危险。有人能给我举一些写我自己的好例子吗。

    你最好的选择可能是创建一个自己的队列实现,该队列在其他队列中循环。例如(在伪代码中):

    循环类{ 队列[]; int电流=0

    CyclicQueue(int size) {
      queues = new Queue[size];
    
      for(int i=0; i<size; i++)
        queues[i] = new LinkedList<T>();
    }
    
    T get() {
      int i = current;
      T value;
      while( (value = queues[i].poll() == null) {
        i++;
        if(i == current)
          return null;
      }
      return value;
    }
    
    CyclicQueue(整数大小){
    队列=新队列[大小];
    
    对于(int i=0;我需要Doug Lea的fork-join帮助吗?不幸的是,我现在只限于Java 6。fork-join似乎只存在于Java 7中。m队列给了你什么,而一个队列没有?我的想法是,我有不同类型的作业,我希望不同类型的作业竞争资源,但我希望相同类型的作业e不竞争资源。但我希望所有类型作业的线程总数保持不变。如果只有一个队列,它首先得到5个A作业,然后5个B作业,这些作业将在AAAAA BBBBB中执行,而我希望它们在ABABABABAB中执行,或者至少接近于该顺序。@Jon您也可以获得fork join框架这是一个为Java6编译的独立jar文件;请查找“PackageJSR166Y”。谢谢,这也是我的想法。