目前多线程下载中,开始就是启动N个线程开始下载,停止的时候,准备是设置每个线程的变量=false,然后线程跳出传输过程,自然结束。
但是暂停处理应该怎么处理,难道是让线程wait或者说有没有这方面的java资料,还有,我现在使用的是ExecutorService创建了一个线程池,构建3个线程,一下子传了5个任务给它,下完一个以后,他会自动下载其他的任务,请问,这个处理是怎么样的,原代码查了没找到,我想看看它的机制。

解决方案 »

  1.   

    暂停就把已经下载的所有block保存下来,然后销毁所有线程。
    等恢复的时候和重新开始一样重建线程,只不过每个线程下载的起如位置不是按全新计算而是根据保存的已经下载的block计算的。
      

  2.   

    比如2个线程下载文件是9字节,那么开始是第一个线程下载1到5共5个字节,第二个线程下载的是6到9共4个字节。
    当暂停时,第一个线程下了3字节,第二个线程下了2字节,这个要保存下来,然后把线程杀了。
    当恢复时先要把保存的数据提出来,重新启动两个线程,第一个线程从第4字节开始到第5字节,第二个线程从第8字节开始到第9字节。利用rang可以轻松计算出来
      

  3.   

    你说的是一般的做法,ExecutorService线程池现在初始化3个线程,任务5个,我一次给他全部任务后,他会下载3个任务,下载完成后又去下载第4个任务,那说明线程池里面的线程没有dead啊,被ExecutorServic转去做其他任务了,这样就节省了线程的创建开销了,所以我就是想了解ExecutorService的做法,如何安排线程做事情,然后根据这样的想法再考虑是否让线程wait,尽量避免创建新线程,停止以后再下载和你说的暂停是一样的,所以我想暂停应该换个思路来考虑。
      

  4.   

    问题是线程怎么杀?
    是对那个实现Runnable的对象传一个参数,告诉他停止,还是直接interrupt?
      

  5.   

    这个我觉得主要就是注意要把记录数据的逻辑和线程分来来,例如记录当前的下载位置,下载数量等信息,暂停的时候保存数据,杀线程,要开始了把数据load出来,线程根据数据来启动下载;
    至于自动开始新的下载任务更简单,就是在线程池一层维护一个等待队列既可
      

  6.   

    在构建ExecutorService时,应该会传入int型参数或者BlockingQueue对象得参数,这个相当于设置了缓冲队列的大小,当你只有3个线程,执行5个任务,就让这3个线程先处理那三个,然后将另外两个放入阻塞队列,等那三个线程有空闲了,就去处理队列里得任务,空闲得时候,自然是线程得wait状态
      

  7.   


    多线程和线程池的实现差不多。
    线程池可以重复利用线程,减少新建线程的开销,建议使用。楼主的关键应该不在使用多个线程还是线程池,而是如何暂停在重新现在。其实暂停的时候要保存每个线程断点信息(比如下载偏移量,下载大小等),然后结束Runable对象。
    继续下载的时候,读取之前保存的断点信息,重新new Runable对象 给线程池schedule。