gpt4 book ai didi

java - 创建具有唯一 id 的多个线程(线程不重叠)

转载 作者:行者123 更新时间:2023-12-04 07:43:35 26 4
gpt4 key购买 nike

更新
我正在解决生产者/消费者问题,我想创建一些生产者和消费者(几个线程),我有一个问题,如何正确创建多个线程,以便一个任务不会由两个线程执行(每个线程都执行不同的任务)。
代码:我试着像这里这样循环:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class ProducerConsumerExample {

public static void main(String[] args) {

BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(10);

for (int i = 0; i < 10 ; i++) {
Producer producer = new Producer(blockingQueue);
Consumer consumer = new Consumer(blockingQueue);

Thread producerThread = new Thread(producer);
Thread consumerThread = new Thread(consumer);

producerThread.start();
consumerThread.start();
}
}
}
输出:但它不起作用,因为线程彼此重叠
Producer produced : 1619703940537
Producer produced : 1619703940537
Producer produced : 1619703940537
Producer produced : 1619703940537
consumed gets: 1619703940537
consumed gets: 1619703940537
consumed gets: 1619703940537
consumed gets: 1619703940537
Producer produced : 1619703940537
consumed gets: 1619703940537

最佳答案

您看到多个线程使用相同的值 System.currentTimeMillis()这使得无法判断发生了什么。将您传递到队列中的 token 更改为唯一的 PER Producer 并包含线程名称:

public void run() {
int counter=0;
while (true) {

try {
String token = Thread.currentThread().toString() + "#"+(counter++);
this.blockingQueue.put(token );
System.out.println("Producer produced nr: " + token );
} catch (InterruptedException e ) {
System.out.println("Producer was interrupted");
}
sleep();
}
}
更改 Consumer.run()也打印线程名称,您将更清楚地看到哪个 Consumer 实例正在使用每个操作以及哪个 Producer:
System.out.println("consumer "+Thread.currentThread()+" gets: " + element);
这有望证明这些是几个生产者 + 消费者处理程序以及生产者-消费者从同一个 BlockingQueue 发送和接收项目的不同排列。

关于java - 创建具有唯一 id 的多个线程(线程不重叠),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67318709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com