`

多线程下载的例子,测试OK

阅读更多

多线程下载的例子,测试OK 

 

 

package download;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.io.ObjectInputStream.GetField;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;




	public class MluThreadDownTest{
		
		
		public static void main(String args[]){
			final int DOWN_THREAD_NUM=4;
			final String OUT_FILE_NAME ="a.rar";
			InputStream[] isArr= new InputStream[DOWN_THREAD_NUM];
			RandomAccessFile[] outArr= new RandomAccessFile[DOWN_THREAD_NUM];
			
			try {
				//URL url=new URL("http://gdwt.newhua.com/down/setup_newhua.zip");
				URL url=new URL("http://zzidc.onlinedown.net/down/warhly.rar");
				
				isArr[0] =url.openStream();
				long fileLen=getFileLength(url);
				System.out.println("网络资源的大小"+fileLen);
				//已输出文件名创建第一个randomAccessFile输出流
				outArr[0]= new RandomAccessFile(OUT_FILE_NAME,"rw");
				//创建一个与下载资源大小相同的空文件
				for(int i=0;i<fileLen;i++){
					outArr[0].write(0);				
				}
				//每线程应该下载的字节数
				long numPerThread= fileLen/DOWN_THREAD_NUM;
				//整个下载资源整除后剩下的余数
				long left=fileLen%DOWN_THREAD_NUM;
				for(int i=0;i<DOWN_THREAD_NUM;i++){
					//为每个线程打开一个输入流,一个RandomAccessFile对象
					//让每个线程分别下载网络资源的不同部分
					if ( i!=0){
						//以URL 打开多个输入流
						isArr[i]=url.openStream();
						//以指定输出文件创建多个RandomAccessFile对象
						outArr[i] = new RandomAccessFile(OUT_FILE_NAME,"rw");	//rw,表示读写								
					}
					//分别启动多个线程来下载网络资源
					if(i==DOWN_THREAD_NUM-1){
						//最后一个线程下载指定NUMpERtHREAD+LEFT个字节
						new DownThread(i*numPerThread,(i+1)*numPerThread+left,isArr[i],outArr[i]).start();
				}else{
						new DownThread(i*numPerThread,(i+1)*numPerThread,isArr[i],outArr[i]).start();
					}
					
				}
			}  catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		

		
		public static long getFileLength(URL url) throws Exception {
			long length=0;
			URLConnection con= url.openConnection();
			long size= con.getContentLength();
			length=size;
			return length;
		}
		
	}
	

	
	
分享到:
评论

相关推荐

    PHP用法CURL_MULTI实现多线程采集的例子_.docx

    `cURL`库提供了一种解决方案,通过`CURL_MULTI`接口支持多线程请求,大大提高了处理速度。本文将详细介绍如何使用PHP的`CURL_MULTI`实现多线程数据采集,并分析其在性能优化上的优势。 首先,我们来看一个简单的`...

    异步线程下载

    在Android开发中,异步线程下载是一种常见的技术,它允许应用在后台执行大文件的下载操作,而不阻塞用户界面。...如果你在实际测试中确认它是OK的,那么这个例子可以作为你未来项目中异步下载功能的一个参考。

    php结合curl实现多线程抓取

    在多线程场景下,cURL的`curl_multi_init()`函数可以帮助我们初始化一个多会话处理器,这样就可以同时处理多个cURL句柄。 以下是一个简单的PHP多线程cURL抓取示例: ```php function Curl_http($array, $timeout)...

    JAVA UDP SendString TEST OK

    在Java编程语言中,UDP(User Datagram Protocol)是一种无连接的传输层协议,常用于需要高效传输但不保证数据完整...此外,可以添加多线程以实现并发发送和接收,或者添加错误检测和重传机制以提高数据传输的可靠性。

    利用pypubsub 进行python线程间通信。

    Python中的线程间通信是多线程编程中的一个重要概念,特别是在需要不同线程协同工作的场景下。本示例中,我们使用了`pypubsub`库来实现Python线程间的消息传递,这是一种发布/订阅(publish/subscribe)模式的通信...

    Android 客户端与服务器通讯的小例子

    总的来说,Android客户端与服务器的通讯涉及网络编程、数据解析、线程管理等多个方面,理解并熟练掌握这些技术对于开发Android应用至关重要。通过研究提供的代码示例,你可以更深入地了解这一过程,并将其应用到自己...

    易语言-HPSocket同步操作例子

    答:常见的ACCESS、SQLITE3都是单机数据库,不支持多线程,所以采用连接池无意义。连接池Ex,支持MSSQL数据库,可以正常使用。 ======================================================================= 7、使用...

    go网络测试代码.go Go网络编程

    通过使用goroutines(轻量级线程)和channels,我们可以在处理多个连接时实现并行性。例如,服务器可以为每个新的连接启动一个新的goroutine: ```go for { conn, err := server.Accept() if err != nil { ...

    libcurl.rar_libcurl_libcurl http_libcurl http_libcurl库

    3. **多线程支持**:libcurl库提供了多线程支持,可以在同一程序中并发处理多个网络请求,提高应用程序的效率。 4. **文件上传下载**:libcurl库能够方便地实现文件的上传和下载,支持断点续传,对于大文件传输非常...

    NanoHttp android 服务器

    3. **线程安全**:服务器支持多线程处理请求,确保并发访问时的稳定性。 4. **自定义响应**:你可以根据需求编写处理函数,生成自定义的HTTP响应,如返回HTML、JSON或者其他数据格式。 在Android中使用NanoHttpd,...

    去字典的例子

    此外,源代码中可能还包括了对并发安全的处理,因为Go的字典不是线程安全的,所以在多 goroutine 环境下,需要额外的同步机制,如互斥锁(`sync.Mutex`)来保证数据一致性。 总之,"去字典的例子"这个主题涵盖了Go...

    nanohttpd-2.3.1.jar包

    如果你需要同时处理大量请求,可能需要考虑多线程或异步处理。 在实际项目中,为了更好地管理HTTP路由,可以使用路由库如`Spark`或`Route4Me`,它们基于NanoHttpd,提供了更高级别的抽象和路由匹配功能。 最后,`...

    压缩与解压

    5. **性能优化**:在处理大量文件或大文件时,可以考虑使用异步操作来避免阻塞UI线程。C#的async/await关键字可以帮助我们在不牺牲用户体验的情况下,执行耗时的操作。 总之,C#提供了丰富的工具和类库,使得在应用...

    在visual studio下实现的.net消息框

    5. **使用多线程**: 如果在非UI线程中显示消息框,可能会引发异常。在这种情况下,需要确保消息框在正确的线程上下文中显示,可以使用`Control.Invoke`或`Control.BeginInvoke`方法。 6. **代码示例**: 以下是...

    真机与pc服务器端数据交互

    本文将详述如何在Android 4.0及以上版本中,通过WiFi环境实现真机(即实际运行Android系统的设备)与PC服务器端进行数据交换,并且会特别关注在网络操作时的多线程处理。 首先,我们要明白为什么在Android 4.0以上...

    PHP mysqli 增强 批量执行sql 语句的实现代码

    因此,务必确保在生产环境中对所有SQL语句进行充分的验证和测试,避免引入潜在的安全问题。 总的来说,mysqli的`multi_query()`方法为PHP开发人员提供了一种有效的方式来提高数据库操作的效率,尤其是在处理大量...

    POCO库及文档

    - **线程和进程**:支持多线程编程,包括线程同步、互斥锁、信号量等。 - **国际化和本地化**:支持多语言环境下的字符串处理。 **2. POCO库的特点** - **跨平台**:POCO库在Windows、Linux、macOS、iOS、Android等...

    MFC调用COM组件的dll源码

    MFC应用默认使用单线程公寓模型(STA),而COM组件可能需要运行在多线程公寓(MTA)或自由线程(Free Threaded)环境中。确保MFC应用和COM组件的线程模型匹配,是成功调用的关键。 总的来说,MFC调用COM组件的dll...

    java实现http服务器实例

    // 多线程处理每个客户端请求 } } static class ClientHandler implements Runnable { private Socket client; public ClientHandler(Socket client) { this.client = client; } @Override public void...

Global site tag (gtag.js) - Google Analytics