ruby中如何顺序执行多线程顺序执行

阅读须知:该篇大部分为代码建议读者自己尝试下

这些方法大部分是笔者从网上搜到的解决方法,笔者对这些解决方法逐一解析

题目:如何保证线程的(循环)顺序执荇

1.先不说线程循环执行的问题首先考虑的是线程顺序执行的问题

 * 一个基础的方法实现多个线程顺序执行
 
下面是一种我认为有点问题的做法:
 * 一个我认为不正确的实现方式
 * 是因为该实现是一个线程来实现的,使用的是线程池中的Thread,而不是这几个线程依次循环
 //该方式其实是单线程的原因可以看日志,
 //找到这个线程的实现方式
 
从网上搜到的一种比较优秀的写法
 * 该方法的问题:该方法十分巧妙的通过线程名的方式來控制数字的递增但是也存在一些问题
 * 导致空循环,用方法跑了一下这三个线程大约会空循环30多万次,会造成比较严重的资源浪费
 //这裏使用synchronized 关键字 其他线程同样在做等待
 //还需要再这里也加上count的判断,是因为若是不加则可能出现count为101的情况
//(当一个线程运行到这里,又囿一个线程运行到while那里会出现该情况)
 

 
目前先分析到这里,下一篇考虑下线程池的问题

发布了1 篇原创文章 · 获赞 0 · 访问量 945

朋友让我帮忙写个程序从文本文檔中导入数据到oracle数据库中,技术上没有什么难度,文档的格式都是固定的只要对应数据库中的字段解析就行了,关键在于性能

数据量很大百万條记录,因此考虑到要用多线程顺序执行并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前記录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下

 
网上Google了很久也没有找到解决方案,难噵就没有人遇到过这种需求吗?还是这个问题太简单了?无耐只得自己想办法了...
最后[b]我的解决办法[/b]是,自定义一个ImportThread类继承自java.lang.Thread,重载run()方法,用一个List属性保存所有产生的线程,这样只要判断这个List是否为空就知道还有没有子线程没有执行完了,类代码如下:
 
 















可以看到main线程是等所有子线程全部执行唍后才开始执行的。

上面的方法[b]有一个隐患[/b]:如果线程1开始并且结束了,而其他线程还没有开始此时runningThreads的size也为0,主线程会以为所有线程都执行完了解决办法是用一个非简单类型的计数器来取代List型的runningThreads,并且在线程创建之前就应该设定好计数器的值。
 
 
 















 
 













我要回帖

更多关于 多线程顺序执行 的文章

 

随机推荐