记多线程下载

URL:同一个URL对象可以多次openConnection()返回多个connection,但是一个connection调用getInputStream(),总是返回同一个inputStream。

URLConnection.setRequestProperty(String key,String value),设置请求属性,可以设置每个线程下载的部分,格式setRequestProperty("Range", "bytes=" + startPos + "-" + endPos)。这里的key和value应该还有其他的用途,留个坑。

read():从URLConnection获得的inputStream的read()方法并不能确保读满buffer或指定的长度,而read的返回值是此次read()的长度,所以要放在while循环中直到读满所要的长度为止,现在还不知道为什么这样设计,只是觉得很不方便。又是一个坑。

主线程等待下载完成:一开始executorService.isTerminated()判断是否所有线程都下载完成,不完成则阻塞主线程。后来用CountDownLatch更优雅的实现此功能,CyclicBarrier同样也能完成。

你可能感兴趣的:(记多线程下载)