JAVA中用多线程技术实现大数据导入

上传人:hs****ma 文档编号:413701725 上传时间:2023-02-27 格式:DOCX 页数:25 大小:19.29KB
返回 下载 相关 举报
JAVA中用多线程技术实现大数据导入_第1页
第1页 / 共25页
JAVA中用多线程技术实现大数据导入_第2页
第2页 / 共25页
JAVA中用多线程技术实现大数据导入_第3页
第3页 / 共25页
JAVA中用多线程技术实现大数据导入_第4页
第4页 / 共25页
JAVA中用多线程技术实现大数据导入_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《JAVA中用多线程技术实现大数据导入》由会员分享,可在线阅读,更多相关《JAVA中用多线程技术实现大数据导入(25页珍藏版)》请在金锄头文库上搜索。

1、JAVA 中用多线程技术实现大数据导入朋友让我帮忙写个程序从文本文档中导入数据到 oracle 数据库中,技术上没有什么难度,文档的格式都是固定的只要 对应数据库中的字段解析就行了,关键在于性能。数据量很大百万条记录,因此考虑到要用多线程并发执行,在 写的过程中又遇到问题,我想统计所有子进程执行完毕总共 的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下 Java 代码long tStart = System.currentTimeMillis();System.out.

2、println(Thread.currentThread().getName() + 开始);/打印开始标记for (int ii = 0; ii < threadNum; ii+) /开 threadNum 个线程 Runnable r = new Runnable()Overridepublic void run()System.out.println(Thread.currentThread().getName() + 开始);/做一些事情. .System.out.println(Thread.currentThread().getName() + 结束.);Thread t =

3、 new Thread(r);t.start();System.out.println(Thread.currentThread().getName() + 结束.);/打印结束标记long tEnd = System.currentTimeMillis();System.out.println(” 总共用时:+ (tEnd - tStart) + millions);long tStart = System.currentTimeMillis();System.out.println(Thread.currentThread().getName() + 开始);/打印开始标记for (int

4、 ii = 0; ii < threadNum; ii+) /开 threadNum 个线程Runnable r = new Runnable()Overridepublic void run()System.out.println(Thread.currentThread().getName() + 开始);/做一些事情. .System.out.println(Thread.currentThread().getName() + 结束.);Thread t = new Thread(r);t.start();System.out.println(Thread.currentThrea

5、d().getName() + 结束.);/打印结束标记long tEnd = System.currentTimeMillis();System.out.println(” 总共用时:+ (tEnd - tStart) + millions);结果是几乎在for循环结束的瞬间就执行了主线程打印总共 用时的语句,原因是所有的子线程是并发执行的,它们运行时 主线程也在运行,这就引出了一个问题即本文标题如何让主 线程等待所有子线程执行完毕。试过在每个子线程开始后加 上t.join(),结果是所有线程都顺序执行,这就失去了并发的意 义了,显然不是我想要的。网上 Google 了很久也没有找到解决方案

6、,难道就没有人遇到 过这种需求吗?还是这个问题太简单了?无耐只得自己想办 法了.最后我的解决办法是,自定义一个 ImportThread 类继承自 java.Iang.Thread,重载run()方法,用一个List属性保存所有 产生的线程,这样只要判断这个List是否为空就知道还有没 有子线程没有执行完了,类代码如下:Java代码pubIic cIass ImportThread extends Thread private static List&It;Thread> runningThreads = new ArrayList&It;Thread>();pubIic Impo

7、rtThread() OverridepubIic void run() regist(this);/线程开始时注册System.out.printIn(Thread.currentThread().getName() + 开始.);/打印开始标记/做一些事情unRegist(this);/线程结束时取消注册System.out.println(Thread.currentThread().getName() + 结束.);/打印结束标记public void regist(Thread t) synchronized(runningThreads) runningThreads.add(t)

8、;public void unRegist(Thread t) synchronized(runningThreads) runningThreads.remove(t);public static boolean hasThreadRunning() return (runningThreads.size() > 0) ; /通过判断runningThreads 是否为空就能知道是否还有线程未执行完 public class ImportThread extends Thread private static List<Thread> runningThreads = ne

9、w ArrayList<Thread>();public ImportThread() Overridepublic void run() regist(this);/线程开始时注册System.out.println(Thread.currentThread().getName() + 开始.);/打印开始标记/做一些事情. .unRegist(this);/线程结束时取消注册System.out.println(Thread.currentThread().getName() + 结束.);/打印结束标记public void regist(Thread t)synchroni

10、zed(runningThreads) runningThreads.add(t);public void unRegist(Thread t)synchronized(runningThreads)runningThreads.remove(t);public static boolean hasThreadRunning() return (runningThreads.size() > 0);/通过判断 runningThreads 是否为空就能知道是否还有线程未执行完主线程中代码: Java 代码 long tStart =System.currentTimeMillis();S

11、ystem.out.println(Thread.currentThread().getName() + 开始);/打印开始标记for (int ii = 0; ii < threadNum; ii+) /开 threadNum 个线程Thread t = new ImportThread();t.start();while(true)等待所有子线程执行完if(!ImportThread.hasThreadRunning()break;Thread.sleep(500);System.out.println(Thread.currentThread().getName() + 结束.);

12、/打印结束标记long tEnd = System.currentTimeMillis();System.out.println(” 总共用时:+ (tEnd - tStart) + millions);long tStart = System.currentTimeMillis();System.out.println(Thread.currentThread().getName() + 开始);/打印开始标记for (int ii = 0; ii < threadNum; ii+) /开 threadNum 个线程Thread t = new ImportThread();t.sta

13、rt();while(true)等待所有子线程执行完if(!ImportThread.hasThreadRunning()break;Thread.sleep(500);System.out.println(Thread.currentThread().getName() + 结束.);/打印结束标记long tEnd = System.currentTimeMillis();System.out.println(” 总共用时:+ (tEnd - tStart) + millions);打印的结果是:main 开始Thread-1 开始.Thread-5 开始.Thread-0 开始.Thre

14、ad-2 开始.Thread-3 开始.Thread-4 开始.Thread-5 结束.Thread-4 结束.Thread-2 结束.Thread-0 结束.Thread-3 结束.Thread-1 结束.main 结束.总共用时:20860millions可以看到main线程是等所有子线程全部执行完后才开始执 行的。=以下为第二次编辑上面的方法有一个隐患:如果线程 1 开始并且结束了,而其他 线程还没有开始此时 runningThreads 的 size 也为 0,主线程 会以为所有线程都执行完了。解决办法是用一个非简单类型 的计数器来取代List型的runningThreads,并且在线

15、程创建 之前就应该设定好计数器的值。MyCountDown 类 Java 代码 public class MyCountDown private int count;public MyCountDown(int count) this.count = count;public synchronized void countDown() count-;public synchronized boolean hasNext() return (count > 0);public int getCount() return count;public void setCount(int count

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号