java 多线程取一条记录_java多线程从队列中取出数据执行

e537a7156517cb6ca29a106c13c0af51.png

天涯尽头无女友

楼上的解释完全正确,不过可以利用s.poll()返回值是否为null,作为跳出条件。下面诗完整代码。packagecom.demo;importjava.util.ArrayList;importjava.util.Random;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.LinkedBlockingQueue;classConsumerimplementsRunnable{privateStringname;privateBlockingQueues=null;publicConsumer(Stringname,BlockingQueues){this.name=name;this.s=s;}publicvoidrun(){try{while(true){Stringproduct=s.poll();if(product==null){break;}intt=(newRandom()).nextInt(10);System.out.println(name+"消费("+product+").");System.out.println(name+"====sleep"+t+"secs====");Thread.sleep(t*1000);}}catch(InterruptedExceptione){e.printStackTrace();}}}publicclassHelloJava8{publicstaticvoidmain(String[]args)throwsInterruptedException{BlockingQueues=newLinkedBlockingQueue();s.put("java");s.put("python");s.put("php");s.put("c++");s.put("c");ArrayListthreadList=newArrayList();Threadt1=newThread(newConsumer("zhangsan",s));t1.start();threadList.add(t1);Threadt2=newThread(newConsumer("lisi",s));t2.start();threadList.add(t2);Threadt3=newThread(newConsumer("wangwu",s));t3.start();threadList.add(t3);Threadt4=newThread(newConsumer("afei",s));t4.start();threadList.add(t4);Threadt5=newThread(newConsumer("jb",s));t5.start();threadList.add(t5);for(Threadthread:threadList){thread.join();}System.out.println("主线程执行完毕");}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对您的需求,可以采用以下的设计方案: 1. 使用一个阻塞队列作为数据的缓存,用于存放即将进行处理的数据。 2. 启动多个工作线程,每个线程从队列取出数据进行处理,处理完成后将结果写入另一个阻塞队列。 3. 启动一个结果合并线程,从结果队列取出处理完成的数据进行合并。 具体实现的代码如下: ```java import java.util.concurrent.*; class Data { String id; String content; int num; public Data(String id, String content, int num) { this.id = id; this.content = content; this.num = num; } } class Result { String id; String content; public Result(String id, String content) { this.id = id; this.content = content; } } class Worker implements Runnable { private BlockingQueue<Data> queue; private BlockingQueue<Result> resultQueue; public Worker(BlockingQueue<Data> queue, BlockingQueue<Result> resultQueue) { this.queue = queue; this.resultQueue = resultQueue; } @Override public void run() { while (true) { try { // 从队列取出数据进行处理 Data data = queue.take(); String id = data.id; String content = data.content; int num = data.num; // 进行数据处理 // ... // 将处理结果写入结果队列 Result result = new Result(id, content); resultQueue.put(result); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Merger implements Runnable { private BlockingQueue<Result> resultQueue; public Merger(BlockingQueue<Result> resultQueue) { this.resultQueue = resultQueue; } @Override public void run() { while (true) { try { // 从结果队列取出处理完成的数据进行合并 Result result = resultQueue.take(); String id = result.id; String content = result.content; // 进行数据合并 // ... } catch (InterruptedException e) { e.printStackTrace(); } } } } public class MultiThreadDataProcessor { public static void main(String[] args) { BlockingQueue<Data> queue = new LinkedBlockingQueue<>(); BlockingQueue<Result> resultQueue = new LinkedBlockingQueue<>(); int workerCount = Runtime.getRuntime().availableProcessors(); ExecutorService executor = Executors.newFixedThreadPool(workerCount); // 启动多个工作线程 for (int i = 0; i < workerCount; i++) { Runnable worker = new Worker(queue, resultQueue); executor.execute(worker); } // 启动结果合并线程 Runnable merger = new Merger(resultQueue); executor.execute(merger); // 不断往队列添加数据 while (true) { // 从数据数据 Data data = getData(); // 将数据添加到队列 try { queue.put(data); } catch (InterruptedException e) { e.printStackTrace(); } } } private static Data getData() { // 从数据数据 return new Data("123", "data", 2); } } ``` 在这个实现,我们使用了两个阻塞队列一个用于存放待处理的数据,另一个用于存放处理完成的结果。我们启动了多个工作线程来并发地处理数据,每个工作线程从队列取出数据进行处理,处理完成后将结果写入另一个队列。最后,我们启动了一个结果合并线程,从结果队列取出处理完成的数据进行合并。 需要注意的是,在实际使用,我们需要根据数据的实际情况来进行调整线程池的大小,以达到最优的处理效率。同时,我们也需要考虑到数据存储的可靠性和性能问题,需要选择合适的存储方式和存储引擎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值