整个流程是这样的,循环从一个文件中读取数据,每读6万条后就要暂停,启动三个线程(每次仅允许三个线程同时处理)来处理这6万条数据,处理结束后,再继续读。。。循环这样直到文件中数据全部处理完。大家帮忙看看,有什么问题没,例如处理流程、并发。。。等方面,多谢!
public class CopyOfTest { public static void main(String[] args) { Producer p = new Producer(); while(p.producer() > 0){ p.cunsumer(); } } } class Producer { private Lock lock = new ReentrantLock(); private Condition notEmpty = lock.newCondition(); private Condition notFull = lock.newCondition(); private List<List<String>> dataList = null; private BufferedReader reader; private static ExecutorService executor = Executors.newFixedThreadPool(3); public Producer() { try { reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("D:/11.txt")), "GBK")); dataList = new ArrayList<List<String>>(); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } } public int producer() { String text = ""; List<String> tmp = new ArrayList<String>(); int count = 0; lock.lock(); try { try { System.out.println("+++++++++++"); if (dataList.size() == 0) { notEmpty.signalAll(); } if (dataList.size() == 3) { try { notFull.await(); } catch (InterruptedException e) { e.printStackTrace(); } } while ((text = reader.readLine()) != null) { count++; System.out.println(count + "+++" + text); tmp.add(text); if (count % 20000 == 0) { dataList.add(tmp); tmp = new ArrayList<String>(); } if (dataList.size() == 3) { break; } } if (count % 60000 != 0) { dataList.add(tmp); } tmp = null; } catch (IOException e1) { e1.printStackTrace(); } if (dataList.size() < 1) { executor.shutdown(); } return dataList.size(); } finally { lock.unlock(); } } public void cunsumer() { lock.lock(); int len = dataList.size(); Future<?>[] futureArr = new Future<?>[len]; try { if (dataList.size() == 0) { try { notEmpty.await(); } catch (InterruptedException e) { e.printStackTrace(); } } if (dataList.size() == 3) { notFull.signalAll(); } for (int i = 0; i < len; i++) { futureArr[i] = executor.submit(new SingleThread12(dataList.get(i))); } boolean flag = true; while (flag) { for (Future<?> f : futureArr) { flag = flag && f.isDone(); } flag = !flag; } dataList = new ArrayList<List<String>>(); } finally { lock.unlock(); } } }
相关推荐
有问题的QT程序 这个程序的功能是客户端向服务器发送一个字符串,服务器接收到这个字符串之后,进行处理(复制一个相同的...(提示说不能向别的线程发送信号/数据,但我所有的问题都是在同一个线程里面处理的啊?)
多线程有bug 下载结束后 自动关闭软件 不急着要的话 建议单线程比较稳定 小米的cookie 打开云相册 刷新后 按f12 抓包获取 小米cookie 有时效 有一个接口可以直接获取 等v2.0后发布更新 大家先用着 昨天其实也发布...
这段代码是百度好友为我解惑帮忙写的两份聊天软件的其中之一,两个功能是一样的,完全可以实现点对点的聊天,只不过一个是用到了异步另一个是多线程同步(其实我觉得通过多线程控制窗体会使得程序清晰易懂,虽说会...
在那个时候基础不好(没学过操作系统),对jvm和多线程只是死记硬背,很多概念根部不理解 只有系统的学习,才能更深的理解 提升 高并发架构(消息队列,搜索引擎,缓存,数据库高级)->分布式系统->springcloud微服务 ->k8s ...
这个问题是由于您的证书安装不正确导致,请重新下载证书,并按里面的“SRCA根证书安装说明手册”重新安装即可解决问题。如果还不行,这也是您自己电脑的问题,请联系您的网络管理员或者与我们的客服取得联系以取得...
3、**本次更新包括数据库读写的权限控制,测试环境有限,有问题再改进,这个只是个雏形,后期还会更强。 4、**主要演示文件是服务端和网盘,请详细阅读。 ================ [2020-2-4日] ================ 1、**...
我在简书的博客中写了一系列总计六篇的CoreData文章,总字数大概3W+,从CoreData的基础使用到使用进阶,再到多线程、版本迁移等高级用法,讲解非常详细。 但CoreData的学习还是应该偏实践,我根据博客中讲到的知识点...
11、修复“线程_等待”命令注释反的问题,返回真表示线程结束,假表示已超时。感谢易友【tone】反馈。 12、修复“类_识图->找图_从字节集”命令,载入大文件直接奔溃的BUG,感谢易友【tone】反馈。 精易模块 V3.80...
my-python-practicessimplemultithreadsCrawler.py:一个简单的多线程生产者消费者爬虫,实际使用的时候可以重写parser的parse_links方法,来写自己的解析规则,然后将解析后将继续要爬的地址放入url队列,生产者会...
非原创,此源码是该模块的作者为了测试多线程而写的。 经过测试,调试情况下运行没发生什么BUG。希望懂的大神有时间的话帮忙看看为什么编译出来后第二次搜索会崩溃。
如果您觉得本文对您有帮助,想让更多人了解Exceptionless,感谢您帮忙点的【推荐】。如果您对 Exceptionless 感兴趣或者是想学习 Exceptionless 的代码,可以加入群Exceptionless QQ群:330316486。 ...
感谢 90后辉煌 提供参考代码,让我们期待已久的超时功能回归,也请大家帮忙测试 【网页_访问_EX 为测试版本,完善后,将会删除该命令,功能会添加到 网页_访问()】 2.增加 线程池类1“取状态” 感谢 我叫林舒书 ...