论坛首页 Java企业应用论坛

java多线程和线程池问题

浏览 16338 次
精华帖 (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文件。每个表产生一个线程。
     }  
    }
   发表时间:2011-10-25  
export(table);  
方法贴出来,如果你写入的文件时被多个线程同时操作的话,会有问题
0 请登录后投票
   发表时间:2011-10-25  
ximenpiaohua 写道
export(table);  
方法贴出来,如果你写入的文件时被多个线程同时操作的话,会有问题

一个表一个线程,是不会出现脏数据的。
0 请登录后投票
   发表时间:2011-10-25  
zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(new File("packageDir", table + ".zip"))));
看你修改成table + ".zip"问题应该不大了
0 请登录后投票
   发表时间:2011-10-26  
如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些
0 请登录后投票
   发表时间:2011-10-26  
darklight 写道
如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些

多线程是为了解决在单一进程等待IO操作时CPU空闲的问题,以及使多道任务同时执行,但是如果没有IO操作,多线程不比单线程快,因为线程切换时也要占用指令周期,但是如果单线程被阻塞了,整个进程就被阻塞,如果多线程的话还又别的线程可以执行,所以进程不会被阻塞。 不知道这样理解是否正确?
请问有其它解决思路吗?
0 请登录后投票
   发表时间:2011-10-26  
mosquito2a 写道
darklight 写道
如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些

多线程是为了解决在单一进程等待IO操作时CPU空闲的问题,以及使多道任务同时执行,但是如果没有IO操作,多线程不比单线程快,因为线程切换时也要占用指令周期,但是如果单线程被阻塞了,整个进程就被阻塞,如果多线程的话还又别的线程可以执行,所以进程不会被阻塞。 不知道这样理解是否正确?
请问有其它解决思路吗?

两个人所说的都有道理。
这这。。。
0 请登录后投票
   发表时间:2011-10-26   最后修改:2011-10-26
这种db导出确实没必要多线程,关键在于导出大表时,需要分批次导出,重点是分批次读取的每个批次的行数的设定,测试性能最优的行数

你仅考虑到提高客户端的效率,其实db端一样要起多线程来应付你的export

多表的同时导出的硬盘io性能很可能比单表的差,涉及到磁头寻道时间的问题,当然如果服务器是ssd硬盘是没这个问题

相对于CPU和内存的速度,硬盘速度对整个系统的影响要大的多

0 请登录后投票
   发表时间:2011-10-26  
darklight 写道
如果表都是在一个数据库内的话,单线程和多线程的操作花费的时间应该相差不大,而且因为资源竞争的问题,多线程的效率可能还低些

多线操作一个数据库很正常啊,比如数据库连接池不就是多个线程都占用了多个数据库连接吗?我认为可以多线程操作多个表
0 请登录后投票
   发表时间:2011-10-26  
为什么使用
new ArrayBlockingQueue<Runnable>(3)?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics