面试题-如果使用Java开发多线程传输文件,你如何实现(只需说明技术和思路)

Java线程

进程:内存中运行的应用程序,每个进程拥有自己独立的一块内存空间
线程:进程中一个执行流程,线程没有自己的虚拟地址空间,与进程内其他线程共享该进程的所有资源
并发:多个线程之间轮换执行【接力跑】
并行:同时执行多个线程【同时跑】

1.创建单线程

创建一个线程并运行

new Thread(new Runnable(){
	//线程体-线程需要执行的任务
	@Override
	public void run(){
		//修改线程名
		Thread.currentThread().setName("我是单个线程");
		//线程运行时打印
		System.out.println(Thread.currentThread().getName());
	}
}).start();

2.创建多线程

创建多线程并运行

for(int i=0;i<10;i++){
	new Thread(new Runnable(){
		//线程体-线程需要执行的任务
		@Override
		public void run(){
			//修改线程名
			Thread.currentThread().setName("我是线程"+i);
			//线程运行时打印
			System.out.println(Thread.currentThread().getName());
		}
	}).start();
}

文件传输

1.文件上传

2.文件下载

3.文件拆分

4.文件合并

T

BS结构

B:H5有文件组件,有文件切割相关属性,把一个文件切割,从文件的第几个字节开始读取,读取多少字节
commons-fileupload
filedataItem
C:Servlet支持多线程
协程:一个线程有多个协程

CS结构

Socket + IO(RandomAccessFile)
java.io.RandomAccessFile:文件随机读写流

多线程使用ExcutorService线程池

上传:
client:

class Client{
	public static void main(){
		//获取文件
		FileInputStream fis=new FileInputStream(path);
		//获取文件长度
		long length=fis.avilable();
		//计算断点
		int point=length/threadNum;
		//让服务器创建文件
		OutputStream os=s.getOutputStream();
		os.write((path+fileName).byteArray());
		//阻塞等待多线程上传结束
		//创建一个固定容量的线程池
		ExecutorService es=ExecutorServices.newFixedThreadPool(threadNum);
		for(int i=0;i<threadNum;i++){
			//建立连接
			Socket s=new Socket(ip,port);
			//多线程上传
			if(i != threadNum){
				endIndex=(i*)
			}else{
				endIndex=length;
			}
			es.execute(new UploadClient(file,index,endIndex,s));
		}
	}
}

class UploadClient implements Runnable{
	//上传的文件
	private File file;
	//读取起始位置
	private int index;
	//读取结束位置
	private int endIndex;
	//客户端对象
	private Socket socket;
	//带参构造方法
	public UploadClient(File file,int index,int endIndex,Socket socket){}
	//线程体
	public void run(){
		RandomAccessFile raf=new RandomAccessFile(file);
		//跳过的字节
		raf.skipBytes(index);
		//读取长度
		byte[] buf=new byte[endIndex-index];
		//读取
		raf.read(buf,index,endIndex-index);
		//通知服务器本次连接上传的是哪一个文件
		//发送
		socket.getOutputStream().write(buf);
		//刷新
		socket.getOutputStream().flush();
		//关闭
		raf.close();
		socket.getOutputStream().close();
	}
}

server


class Server{
	ServerSocket ss=new ServerSocket(port);
	while(true){
		Socket socket=ss.accept();
		new Thread(new Runnable(){
			private Socket s;
			
		}.start());
	}
}

工作:异常+集合+IO+多线程+网络+框架

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页