java 线程 消息,Java多线程消息传递

该博客介绍了如何使用Java的BlockingQueue来实现两个线程之间的通信,其中一个线程写入队列,另一个线程异步读取。作者创建了一个第三线程,用于生成20个工作线程,每个工作线程都有唯一ID,并需要接收特定数据进行处理。通过将队列存储在映射中,可以根据ID将数据发送到对应的工作线程,实现了高效的线程间数据传递。
摘要由CSDN通过智能技术生成

I have an app with two threads, 1 that writes to a queue and the second one that read async from it.

I need to create a third one that generate 20 more.

the newly created threads will run till explicitly stopped. those 20 threads should get "live" data in order to analyze it.

each of the 20 has a unique ID/name. I need to send the relevant data (that the READ thread collect) to the correct thread (of the 20 threads). e.g. if the data include a string with id (in it) of 2 --> I need to send it to thread with the ID =2.

my question is: how should I hold a "pointer" to each of the 20 threads and send it the relevant data? (I can search the id in a runnable list (that will hold the threads)--> but then I need to call to a method "NewData(string)" in order to send the data to the running thread).

How should I do it?

TIA

Paz

解决方案

You would probably be better to use a Queue to communicate with your threads. You could then put all of the queues in a map for easy access. I would recommend a BlockingQueue.

public class Test {

// Special stop message to tell the worker to stop.

public static final Message Stop = new Message("Stop!");

static class Message {

final String msg;

// A message to a worker.

public Message(String msg) {

this.msg = msg;

}

public String toString() {

return msg;

}

}

class Worker implements Runnable {

private volatile boolean stop = false;

private final BlockingQueue workQueue;

public Worker(BlockingQueue workQueue) {

this.workQueue = workQueue;

}

@Override

public void run() {

while (!stop) {

try {

Message msg = workQueue.poll(10, TimeUnit.SECONDS);

// Handle the message ...

System.out.println("Worker " + Thread.currentThread().getName() + " got message " + msg);

// Is it my special stop message.

if (msg == Stop) {

stop = true;

}

} catch (InterruptedException ex) {

// Just stop on interrupt.

stop = true;

}

}

}

}

Map> queues = new HashMap<>();

public void test() throws InterruptedException {

// Keep track of my threads.

List threads = new ArrayList<>();

for (int i = 0; i < 20; i++) {

// Make the queue for it.

BlockingQueue queue = new ArrayBlockingQueue(10);

// Build its thread, handing it the queue to use.

Thread thread = new Thread(new Worker(queue), "Worker-" + i);

threads.add(thread);

// Store the queue in the map.

queues.put(i, queue);

// Start the process.

thread.start();

}

// Test one.

queues.get(5).put(new Message("Hello"));

// Close down.

for (BlockingQueue q : queues.values()) {

// Stop each queue.

q.put(Stop);

}

// Join all threads to wait for them to finish.

for (Thread t : threads) {

t.join();

}

}

public static void main(String args[]) {

try {

new Test().test();

} catch (Throwable t) {

t.printStackTrace(System.err);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值