目前多线程下载中,开始就是启动N个线程开始下载,停止的时候,准备是设置每个线程的变量=false,然后线程跳出传输过程,自然结束。
但是暂停处理应该怎么处理,难道是让线程wait或者说有没有这方面的java资料,还有,我现在使用的是ExecutorService创建了一个线程池,构建3个线程,一下子传了5个任务给它,下完一个以后,他会自动下载其他的任务,请问,这个处理是怎么样的,原代码查了没找到,我想看看它的机制。
但是暂停处理应该怎么处理,难道是让线程wait或者说有没有这方面的java资料,还有,我现在使用的是ExecutorService创建了一个线程池,构建3个线程,一下子传了5个任务给它,下完一个以后,他会自动下载其他的任务,请问,这个处理是怎么样的,原代码查了没找到,我想看看它的机制。
等恢复的时候和重新开始一样重建线程,只不过每个线程下载的起如位置不是按全新计算而是根据保存的已经下载的block计算的。
当暂停时,第一个线程下了3字节,第二个线程下了2字节,这个要保存下来,然后把线程杀了。
当恢复时先要把保存的数据提出来,重新启动两个线程,第一个线程从第4字节开始到第5字节,第二个线程从第8字节开始到第9字节。利用rang可以轻松计算出来
是对那个实现Runnable的对象传一个参数,告诉他停止,还是直接interrupt?
至于自动开始新的下载任务更简单,就是在线程池一层维护一个等待队列既可
多线程和线程池的实现差不多。
线程池可以重复利用线程,减少新建线程的开销,建议使用。楼主的关键应该不在使用多个线程还是线程池,而是如何暂停在重新现在。其实暂停的时候要保存每个线程断点信息(比如下载偏移量,下载大小等),然后结束Runable对象。
继续下载的时候,读取之前保存的断点信息,重新new Runable对象 给线程池schedule。