当前位置: 首页 > 知识库问答 >
问题:

使用唯一id创建多个线程(线程不重叠)

黎征
2023-03-14

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

代码:我试着做一个循环,就像下面这样:

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

共有1个答案

百里修真
2023-03-14

您正在寻找的是线程池。在Java中包含了各种实现,这些实现应该是开箱即用的。下面是我从JavaPoint中提取的一个定义:

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

您可以查看以下页面获得更多信息:

https://www.baeldung.com/thread-pool-Java-and-guava https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

 类似资料:
  • 本文向大家介绍java 线程创建多线程详解,包括了java 线程创建多线程详解的使用技巧和注意事项,需要的朋友参考一下 Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类。 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.sta

  • 我编写了代码示例: 每100毫秒提交一个新任务(总任务量-20)。每个任务持续时间-0.5秒。因此,可以并行执行5个任务,最佳执行时间为:20*100 500=2.5秒,池应创建5个线程 但我的实验显示为9.6秒。我打开jsvisualvm查看池创建了多少线程,我看到只创建了一个线程: 请更正我的线程池配置不正确的地方。

  • 问题内容: 我是线程新手。我想创建一些与主线程分开工作的简单函数。但这似乎不起作用。我只想创建一个新线程,并在那里独立于主线程发生的事情做一些事情。这段代码看起来很怪异,但到目前为止,我对线程的了解还很少。你能解释一下这是怎么回事吗? 问题答案: 您正在线程方法中调用该方法。但是只有在线程已经启动时才调用该方法。改为这样做:

  • 问题 你创建一个工作者线程池,用来响应客户端请求或执行其他的工作。 解决方案 concurrent.futures 函数库有一个 ThreadPoolExecutor 类可以被用来完成这个任务。 下面是一个简单的TCP服务器,使用了一个线程池来响应客户端: from socket import AF_INET, SOCK_STREAM, socket from concurrent.futures

  • 我必须得到如下输出: 这是我的密码。没有错误。它以PlusThread开始并打印第一行。然后它将释放锁。之后,MultiplyThread开始运行。它将打印所有行,而不是通知PlusThread。 这是我的输出:

  • 本文向大家介绍Java多线程——之一创建线程的四种方法,包括了Java多线程——之一创建线程的四种方法的使用技巧和注意事项,需要的朋友参考一下 1.实现Runnable接口,重载run(),无返回值 2.继承Thread类,复写run() 使用时通过调用Thread的start()(该方法是native),再调用创建线程的run(),不同线程的run方法里面的代码交替执行。 不足:由于java为单