锁定老帖子 主题:java多线程和线程池问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-25
最后修改:2011-10-25
代码如下 ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(1, 3, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),new ThreadPoolExecutor.CallerRunsPolicy()); for (String table : tables) { poolExecutor.execute(new ExportTask(entityName)); } class ExportTask implements Runnable { ZipOutputStream zos; String table; public ExportTask(String table) throws FileNotFoundException { this.table =table; zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File("packageDir", table + ".zip")))); } public void run() { // export the table data into file Export e = new Export(); e.export(table); // 每次导出生成zip文件。每个表产生一个线程。 } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-25
export(table);
方法贴出来,如果你写入的文件时被多个线程同时操作的话,会有问题 |
|
返回顶楼 | |
发表时间:2011-10-25
ximenpiaohua 写道 export(table);
方法贴出来,如果你写入的文件时被多个线程同时操作的话,会有问题 一个表一个线程,是不会出现脏数据的。 |
|
返回顶楼 | |
发表时间:2011-10-25
zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File("packageDir", table + ".zip"))));
看你修改成table + ".zip"问题应该不大了 |
|
返回顶楼 | |
发表时间:2011-10-26
如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些
|
|
返回顶楼 | |
发表时间:2011-10-26
darklight 写道 如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些
多线程是为了解决在单一进程等待IO操作时CPU空闲的问题,以及使多道任务同时执行,但是如果没有IO操作,多线程不比单线程快,因为线程切换时也要占用指令周期,但是如果单线程被阻塞了,整个进程就被阻塞,如果多线程的话还又别的线程可以执行,所以进程不会被阻塞。 不知道这样理解是否正确? 请问有其它解决思路吗? |
|
返回顶楼 | |
发表时间:2011-10-26
mosquito2a 写道 darklight 写道 如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些
多线程是为了解决在单一进程等待IO操作时CPU空闲的问题,以及使多道任务同时执行,但是如果没有IO操作,多线程不比单线程快,因为线程切换时也要占用指令周期,但是如果单线程被阻塞了,整个进程就被阻塞,如果多线程的话还又别的线程可以执行,所以进程不会被阻塞。 不知道这样理解是否正确? 请问有其它解决思路吗? 两个人所说的都有道理。 这这。。。 |
|
返回顶楼 | |
发表时间:2011-10-26
最后修改:2011-10-26
这种db导出确实没必要多线程,关键在于导出大表时,需要分批次导出,重点是分批次读取的每个批次的行数的设定,测试性能最优的行数
你仅考虑到提高客户端的效率,其实db端一样要起多线程来应付你的export 多表的同时导出的硬盘io性能很可能比单表的差,涉及到磁头寻道时间的问题,当然如果服务器是ssd硬盘是没这个问题 相对于CPU和内存的速度,硬盘速度对整个系统的影响要大的多 |
|
返回顶楼 | |
发表时间:2011-10-26
darklight 写道 如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些
多线操作一个数据库很正常啊,比如数据库连接池不就是多个线程都占用了多个数据库连接吗?我认为可以多线程操作多个表 |
|
返回顶楼 | |
发表时间:2011-10-26
为什么使用
new ArrayBlockingQueue<Runnable>(3)? |
|
返回顶楼 | |