http多线程下载

public class MultiThreadDownloadTest {
	
	public static void main(String[] args) throws Exception
	{
		String urlStr = "http://wwww.153.xdowns.com/uploadFile/2011-5/360duTMShutdown.zip";
		URL url = new URL(urlStr);
		URLConnection con = url.openConnection();
		int contentLen = con.getContentLength();
		
		
		int threadCount = 2;
		int subLen = contentLen / threadCount;
		int remainder = contentLen % threadCount;

		File destFile = new File("d:\\1.rar");
		
		for(int i = 0;i<threadCount;i++)
		{
			int start = subLen * i;
			int end = start + subLen - 1;
			
			if(i==threadCount - 1)
			{
				end += remainder;
			}
			Thread t = new Thread(new DownloadRunnable(start, end, url, destFile));
			t.start();
		}
	}
}

class DownloadRunnable implements Runnable{
	
	private  int start;
	
	private int end;
	
	private URL srcURL;
	
	private File destFile;
	
	private static final int BUFFER_SIZE = 8192;

	
	public DownloadRunnable(int start,int end,URL srcURL,File destFile)
	{
		this.start = start;
		this.end = end;
		this.srcURL = srcURL;
		this.destFile = destFile;
	}
	
	@Override
	public void run() 
	{
		System.out.println(Thread.currentThread().getName()+ " 启动.....");
		BufferedInputStream bis = null;
		RandomAccessFile rf = null;
		
		byte[] buf = new byte[BUFFER_SIZE];
		
		URLConnection con = null;
		
		try{
			con = srcURL.openConnection();
			con.setRequestProperty("range", "bytes="+start + "-" + end);
			bis = new BufferedInputStream(con.getInputStream());
			
			rf = new RandomAccessFile(destFile, "rw");
			rf.seek(start);
			int len = -1;
			
			while((len = bis.read(buf))!=-1)
			{
				rf.write(buf, 0, len);
			}
			
			System.out.println(Thread.currentThread().getName() + "已下载完毕");
		}catch (Exception e) 
		{
			e.printStackTrace();
		}finally
		{
			if(rf != null)
			{
				try {
					rf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if(bis != null)
			{
				try {
					bis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
}

你可能感兴趣的:(多线程,thread)