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

Java 创建具有唯一id的多个线程(线程不重叠),java,multithreading,loops,producer-consumer,Java,Multithreading,Loops,Producer Consumer,更新 我正在解决一个生产者/消费者问题,我想创建几个生产者和消费者(几个线程),我有一个问题:如何正确创建几个线程,使一个任务不由两个线程执行(每个线程执行不同的任务) 代码:我试着在循环中这样做: import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; public class ProducerConsumerExample { pu

更新

我正在解决一个生产者/消费者问题,我想创建几个生产者和消费者(几个线程),我有一个问题:如何正确创建几个线程,使一个任务不由两个线程执行(每个线程执行不同的任务)

代码:我试着在循环中这样做:

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();
            }
        }
    }

您要查找的是线程池。Java中包含各种各样的实现,这些实现应该是开箱即用的。以下是我已经得出的定义:

Java线程池表示一组等待作业并多次重用的工作线程。对于线程池,将创建一组固定大小的线程。从线程池中取出一个线程,并由服务提供者分配一个作业

有关详细信息,请查看以下页面:


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

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实例正在使用每个操作,以及哪个生产者:

System.out.println("consumer "+Thread.currentThread()+" gets: " + element);

这将有希望证明,这是几个生产者+消费者处理程序,以及生产者-消费者从同一封锁队列发送和接收项目的不同排列。

每次循环时,变量都被覆盖,以这种方式在循环中声明变量是错误的做法。推荐的方法是使用ExecutorService,打印
1619703940537
的缺失代码是什么?@DuncG I使用生产者和消费者类更新了内容
System.out.println("consumer "+Thread.currentThread()+" gets: " + element);