Java 使用什么类型的队列在工作线程之间分配作业

Java 使用什么类型的队列在工作线程之间分配作业,java,multithreading,queue,Java,Multithreading,Queue,我是java新手,我想编写一个线程库作为练习。它将以这种方式工作 在主线程中,一些作业(作为字符串)将添加到作业队列中,当工作线程完成这些作业时,它会将其添加到完成队列中。主线程将从完成的队列中获取结果。当所有作业完成时,主线程将发出停止的信号。以下是我迄今为止编写的一些代码: public List<int> get() { WorkerThread[] threads = new WorkerThread[numThreads]; LinkedList<in

我是java新手,我想编写一个线程库作为练习。它将以这种方式工作

在主线程中,一些作业(作为字符串)将添加到作业队列中,当工作线程完成这些作业时,它会将其添加到完成队列中。主线程将从完成的队列中获取结果。当所有作业完成时,主线程将发出停止的信号。以下是我迄今为止编写的一些代码:

public List<int> get() {
    WorkerThread[] threads = new WorkerThread[numThreads];
    LinkedList<int> results = new LinkedList<>();
    int workCount = 0;

    for (int i = 0; i < numThreads; i++) {
        threads[i] = new WorkerThread();
        threads[i].start();
    }
    // reader is a BufferedReader
    while ((String line = reader.readLine()) != null) {
        // put string to job queue
        workCount++
    }
    while(workCount) {
        //result = get result from finished queue, and add it to results LinkedList
        workCount--;  
    }
    for (int i = 0; i < numThreads; i++) {
        threads[i].canStop(); // this sets a private variable that makes infinite while loop to stop
        threads[i].join();
    }
    return results;
}
公共列表get(){
WorkerThread[]threads=新的WorkerThread[numThreads];
LinkedList结果=新建LinkedList();
int workCount=0;
for(int i=0;i
但是我不知道该使用什么样的队列实现。如图所示,有11种不同类型的队列实现。

A是一种基于链接节点的无界线程安全队列

当许多线程将共享对一个线程的访问时,这是一个合适的选择 公共集合,但此类不允许使用null 元素


这包含可用于多线程的不同队列实现之间的比较

由于队列将从许多不同的线程访问,因此使用java.util.concurrent中的一个队列实现可能会更有效。其他队列可能需要显式同步

尝试
ArrayBlockingQueue
例如,它实现了一个有界的环形缓冲区。事实上,它是有界的,这意味着当提交作业的速度快于处理作业的速度时,它会自动应用背压;在内存耗尽之前,队列不会一直增长


这些实现在性能特征上差异很大,不同的作业负载可能会从不同的队列中受益。您应该测试哪个选项最适合您的情况。

如果有多个线程访问同一队列,则建议所有java.util.concurrent中的
队列
实现(实际上它们也是
阻塞队列
实现)。即使在只读函数上(否则您可能会有两个线程从队列轮询同一作业并执行该作业的风险)。也就是说,如果您不想自己花费大量时间同步访问(并测试同步)

然后,选择取决于您希望在队列中使用的额外功能。
LinkedBlockingQueue
ArrayBlockingQueue
之间的区别在于各种基本操作(插入、删除、选择等)的性能
PriorityBlockingQueue
允许您根据自己的条件“推送”(也称为优先顺序)某些作业与其他作业进行比较(我相信它是作为堆实现的,但不要引用我的话)
DelayQueue
按照名称所示,它允许您将某些作业延迟一定的时间

我喜欢ConcurrentLinkedQueue,因为它使用了一种“无等待”算法,理论上比同步(等待资源)函数更好


另一方面:我建议您查看一下
Executor
Executors
ExecutorService
,而不要管理自己的线程集合。

这是Java 7或8的新功能吗?原始泛型?真的吗?这是Java7。我是新来的,如果有明显的错误,我很抱歉。这段代码编译吗?我找不到它的任何引用。它还没有编译。我粘贴它只是为了显示我想要什么样的程序。好吧,我希望:)你应该将
LinkedList
更改为
LinkedList