进程和线程(二)

线程使用的场合

线程通常用在于一个程序中需要同时完成多个任务的情况,我们可以将每个任务定义为一个线程,使他们得以一同工作。
例如在玩某个游戏时,这个游戏由系统运行,所以其运行在一个进程中,而在游戏中的背景音乐,某个角色在移动,出现某些绚丽的动画效果等,这些事情是无法在单一线程完成的。
也可以用于单一线程中可以完成,但是使用多线程可以更快的情况,比如像腾讯视频App可以打开很多节点同时下载几个文件。

并发原理

多个线程或进程“同时运行”只是我们感官上的一种表现,事实上进程和线程是并发运行的,OS的线程调度机制将时间划分为很多时间片段,尽可能均匀分配给正在运行的程序,获取CPU时间片的线程或进程得以被执行,其他而等待。而CPU则在这些进程或线程上来回切换运行,微观上所有进程和线程是走走停停的。宏观上都在运行,这种都运行的现象叫做并发。但不是绝对意义上的同时发生。

线程状态

线程在其声明周期中的各个状态。
new(新建状态)
当我们创建一个线程时,该线程并没有纳入线程调度,其处于一个new状态。
Runnable(就绪状态)
当调用线程的start方法后,该线程纳入线程调度的控制,其处于一个可运行状态,等待分配时间片段以并发运行。
Running(运行状态)
当该线程被分配到了时间片段后其被CPU运行,这是该线程处于Running状态
Blocked(阻塞状态)
当线程在运行过程中可能会出现阻塞状态,比如等待用户输入信息等,但阻塞状态不是百分百出现的,具体要看代码中是否有相关需求,
Dead(死亡状态)
当线程的任务全部运行完毕,或在运行过程中抛出了一个未捕获的异常,那么线程结束,等待GC回收(你永远无法叫醒一个死亡的线程。)

创建线程

Thread创建并启动线程

java.lang.Thread类是线程类,其每一个实例表示一个可以并发运行的线程。我门可以通过继承该类并重写run方法来定义一个具体的线程。其中重写run 方法的目的是定义该线程要执行的逻辑,启动线程时要调用线程的start()方法而非直接调用run方法。start方法 会将当前线程纳入线程高度,使当前线程可以开始并发运行。当线程获取时间片段后会自动开始执行run方法中的逻辑。

Runnable创建并启动线程

实现Runnable接口并重写run方法来定义线程体,然后在创建线程的时候将Runnable的实例传入并启动线程。
这样做的好处在于可以将线程与线程要执行的任务分离开
减少耦合,同时java是单继承的,定义一个类实现Runnable接口这样的作法可以更好的去实现其他父类或接口。因为接口是多继承关系。

使用内部类创建线程

通常我们可以通过匿名内部类的方式创建线程,使用该方式可以简化编写代码的复杂度,当一个线程需要一个实例时我们通常使用这种方式来创建。

继承Thread方式

Thread thread = new Thread(){	//匿名类方式创建线程
	public void run(){
		//线程体

	}

};
thread.start(); 		//启动线程


Runnable方式

		public void run(){
			

		}

}
Thread thread  = new Thread(runnable);
thread.start();		//启动线程


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值