3

我是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;
}

但是我对为此使用哪种 Queue 实现感到困惑。如文档所示,有 11 种不同的队列实现。

4

3 回答 3

1

ConcurrentLinkedQueue是基于链接节点的无界线程安全队列。

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

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

于 2013-08-12T12:06:22.983 回答
1

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

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

我喜欢ConcurrentLinkedQueue它,因为它使用“无等待”算法,理论上该算法优于同步(等待资源)函数。

另一方面:我建议你看一下ExecutorExecutorsExecutorService不是管理你自己的线程集合。

于 2013-08-12T12:20:07.330 回答
0

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

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

实现的主要区别在于性能特征,不同的作业负载可能会从不同的队列中受益。您应该测试哪个选项最适合您的情况。

于 2013-08-12T12:06:28.990 回答