【问题标题】:independent multi-threading and sharing data problem独立多线程和共享数据问题
【发布时间】:2021-10-15 05:26:49
【问题描述】:

背景

我打算制作一个每分钟运行一次的调度程序。每次运行时,都会给出不同的目标数据,每次可能需要大约 90 秒的时间。

我的计划

过程是这样的:

multiple producers(threads) : 
1. get data from some API
2. using data from 1. parse given data
3. put it into a common queue

common queue

multiple consumers(threads) : 
1. get data from the queue
2. call some API
3. then insert into RDB

(每个数据的顺序无关紧要)

如果我理解正确,当用户线程正在运行时,主线程可能会提前完成,并且进程将继续运行直到这些用户线程完成。

问题/疑问

我希望每个进程都有自己的公共队列,仅用于来自同一进程的线程。也希望在每个进程完成后释放某个队列的内存。

我的意思是,有可能像下面这样吗? :

  1. 正在运行进程 A,只有 A 中的线程可以访问队列 X。
  2. 运行进程 B,只有 B 中的线程可以访问队列 Y。
  3. 关闭进程A,释放队列X的内存。
  4. 正在运行进程 C,只有来自 C 的线程才能访问队列 Z。
  5. 关闭进程B,释放队列Y的内存。
  6. 关闭进程C,释放队列Z的内存。

这是我第一次处理多线程。 先感谢您! :)

【问题讨论】:

  • @Salil 谢谢!当进程 A、B 运行时,这意味着有 2 个阻塞队列。进程 A 的线程是否可以访问进程 B 的阻塞队列?进程 A 完成后来自进程 A 的阻塞队列是否空闲?
  • 这里的“过程”是什么意思?您是指实际的 Java 虚拟机进程吗?还是你的一些内部抽象?
  • 我的意思是,我的流程:生产者 - 队列 - 消费者
  • 例如 [2021-19-15 17:07:00] 进程 A 运行 [2021-19-15 17:08:00] 进程 B 运行 [2021-19-15 17:08] :30] 流程 A 完成 [2021-19-15 17:09:30] 流程 B 完成

标签: java multithreading


【解决方案1】:

我会这样设计: 使用分配给自己队列的“Workers”的“Thread Pool”。 “Worker”是一个扩展线程并对其队列有私有引用的类。所以,Worker 的线程池实际上是一组线程,它们都在监听同一个队列。 然后你可以定义一个 ProducerWorker 来扩展一个 Worker。这些生产者工作人员将处理 API 并放入他们的公共队列中。 同样,ConsumerWorker 是工作人员池中的工作人员,它处理从它所引用的公共队列中消费“任务”。 在此设计中,您对线程“类型”(不同的工作人员)进行了逻辑分离,因此您可以进行更通用的分离,而不仅限于不同的进程。 这就是设计。 要实现,您需要阅读有关线程池和扩展线程的信息。 您可以编写自己的“线程池”或更好地使用 Java 的内置实现 ExecutorService 来创建池:
示例:

ExecutorService poolAlpha = Executors.newFixedThreadPool(10);
ExecutorService poolBeta = Executors.newFixedThreadPool(10);
poolAlpha.submit( alphaWorker );
poolBeta.submit( betaWorker );

这是基本 Worker 应该是什么样子的伪代码:

    class Worker extends Thread {
        private Queue myCommonQueue;
        private Runnable myWork;

        // to know when to stop the thread.
        private boolean isRunning = true;

       // Constructor
       public Worker(Queue queue, Runnable work) {
         this.myCommonQueue = queue;
         this.myWork = work;
       }
   }
   

【讨论】:

  • 我要去学习 ExecutorService 部分,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多