java线程实战:多线程下载(上)

线程概念与创建方法
本文介绍了线程的基本概念,包括线程与进程的区别、并发与并行的概念,并详细讲解了三种创建线程的方法:继承Thread类、实现Runnable接口及使用匿名内部类。

Q:什么是线程?什么时候需要用到线程?线程跟进程有什么区别?

A:①线程被称作轻量级进程,是程序执行流的最小单元。线程又分为并发、并行。某一个时间点,一个cpu只会运行某个线程中的单个线程

并发(current):一个线程占用cpu后,它没有立即完成任务而是在等待,那么其他线程允许切换进来占用cpu执行任务。

并行(parallel):假如计算机支持4cpu4线程,这种支持4个线程同时运行而不必切换线程完成任务的就是并行。

②使用线程时一般都是多线程,只开一个线程的意义不大,所以又有了多线程的出现。比如下载一部电影,假如分配3个线程来下载电影(并不是线程越多越好,下载速度取决于网络的带宽),每个线程负责下载文件的一部分,如果计算机有3个cpu,就支持3线程同时运行达到同时下载的目的,下载速度取决于线程数与网络带宽二者,不可盲目认为线程越多越快。使用场景要开发者去感知是否真的需要使用多线程,譬如:100K的文件有必要多线程下载吗?100G的文件呢?显然是后者使用多线程下载才是正确的选择。

③一个进程由一个或者多个线程组成。进程是一个运行单元,线程则是更小的运行单元。


如何创建一个线程呢?

第一种方法:①新建继承Thread的子类  ②重写run方法  ③实例化子类,启动线程

public class Demo1 extends Thread {
	
	//重写run方法
	@Override
	public void run(){
		System.out.println("创建线程的第1种方法");
	}
	
	public static void main(String[] args) {
		Demo1 demo1 = new Demo1();
		demo1.start();
	}
	
}


第二种方法:①实现Runnable接口  ②重写run方法  ③Thread方法接受一个Runnable target

因为Demo2实现了Runnable方法,成为了Runnable的一个target,

所以有:【Thread thread = new Thread(demo2);】



public class Demo2 implements Runnable{
	
	@Override
	public void run() {
		System.out.println("创建线程的第2种方法");
	}

	public static void main(String[] args) {
		Demo2 demo2 = new Demo2();
		Thread thread = new Thread(demo2);
		thread.start();
	}
}

第三种方法:也是最为常用的方法,使用匿名内部类创建线程。

匿名内部类的好处:

当某个类需要调用接口的一个功能,而且只使用一次。常规做法是new一个类实现接口的功能,然后实例化对象,通过对象调用接口的方法达到目的。

而使用匿名内部类就可不必新建一个类,使代码更简洁

public class Demo3{
	
	public static void main(String[] args) {
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("创建线程的第3种方法");
				
			}
		}).start();
		
	}
}


下篇将带来线程实战:多线程下载。

1.得到服务器下载文件的大小,然后在本地设置一个临时文件服务器端文件大小一致 a)获得访问网络地址 b)通过URL对象的openConnection()方法打开连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii.setConnectTimeout iii.setReadTimeout d)判断是否响应成功 e)获取文件长度(getContentLength()) f)随机访问文件的读取与写入RandomAccessFile(file, mode) g)设置临时文件与服务器文件大小一致(setLength()) h)关闭临时文件 2.计算出每个线程下载的大小(开始位置,结束位置) a)计算出每个线程下载的大小 b)for循环,计算出每个线程的开始、结束位置 c)最后一个线程处理 3.每创建好一次就要开启线程下载 a)构造方法 b)通过URL对象的openConnection()方法打开连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii.setConnectTimeout d)判断是否响应成功(206) e)获取每个线程返回的流对象 f)随机访问文件的读取与写入RandomAccessFile(file, mode) g)指定开始位置 h)循环读取 i.保存每个线程下载位置 ii.记录每次下载位置 iii.关闭临时记录位置文件 iv.随机本地文件写入 v.记录已下载大小 i)关闭临时文件 j)关闭输入流 4.为了杀死线程还能继续下载的情况下,从本地文件上读取已经下载文件的开始位置 a)创建保存记录结束位置的文件 b)读取文件 c)将流转换为字符 d)获取记录位置 e)把记录位置赋给开始位置 5.当你的n个线程下载完毕的时候我进行删除记录下载位置的缓存文件 a)线程下载完就减去 b)当没有正在运行的线程时切文件存在时删除文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值