多线程的基础应用

 

一、线程与进程

理解概念

Ø 进程是操作系统进行资源(包括cpu、内存、磁盘IO等)分配的最小单位

Ø 线程是cpu调度和分配的基本单位

Ø 我们打开的微信,浏览器都是一个进程

Ø 进程可能有多个子任务,比如微信要接受消息,发送消息,这些子任务就是线程。

Ø 资源分配给进程,线程共享进程资源。

区别对比

对比

进程

线程

定义

进程是程序运行的一个实体的运行过程,是系统进行资源分配和调配的一个独立单位

线程是进程运行和执行的最小调度单位

系统开销

创建撤销切换开销大,资源要重新分配和收回

仅保存少量寄存器的内容,开销小,在进程的地址空间执行代码

拥有资产

资源拥有的基本单位

基本上不占资源,仅有不可少的资源(程序计数器,一组寄存器和栈)

调度

资源分配的基本单位

独立调度分配的单位

安全性

进程间相互独立,互不影响

线程共享一个进程下面的资源,可以互相通信和影响

地址空间

系统赋予的独立的内存地址空间

由相关堆栈寄存器和和线程控制表TCB组成,寄存器可被用来存储线程内的局部变量

二、线程的历史和优势

历史:

Ø 在没有操作系统的时候,一台计算机只执行一个程序,在那个时候,对珍贵的计算机资源来说是一种浪费

Ø 为了提高资源利用率(比如在等待输入的时候,可以执行其他程序),为了提高公平性(不同用户和程序对计算机上的资源有平等的使用权),为了提高便利性(实现多个任务的时候,可以通过多个程序,而不用一个程序实现多个任务)计算机加入了操作系统

Ø 同样,相同的原因,线程诞生了。线程可以共享进程的资源。

优势:

随着技术的发展,多处理器系统越来越普及。在一个双处理器系统上,如果只用一个线程,那么无疑浪费了资源。我们需要发挥多处理器的强大功能

三、线程的应用

1.创建线程

继承Thread

实现Runnable接口

2.线程优先级

规则性,cpu尽量将资源给优先级高的

随机性,优先级较高的不一定先执行完run方法

3.线程的礼让(yield)

放弃当前cpu资源,让其他任务去占用,但是什么时候放弃不知道,因为放弃后,可能又开始获得时间片

4.线程中断(interrupt)

线程对象有一个boolean变量代表是否有中断请求,interrupt方法将线程的中断状态设置会true,但是并没有立刻终止线程,就像告诉你儿子要好好学习一样,但是你儿子怎么样关键看的是你儿子。

线程的合并(join)

主线程和子线程同时运行,满足一定条件后,让子线程先运行至结束

6.判断是否中断

interrupted方法判断当前线程是否中断,清除中断标志

isInterrupt 方法判断线程是否中断,不清除中断标志

四、线程的生命周期

Ø 新建(New):创建后尚未启动的线程

Ø 运行(Runanle):包括了操作系统线程中的Running和Ready,处于此状态的线程 可能正在执行或者等待cpu分配时间片

Ø 无限期等待(Waiting):等待被其他线程显式唤醒,执行wait或者join方法或者LockSupport的park方法

Ø 限期等待(Timed Waiting):一定时间后会由系统自动唤醒

Ø 阻塞(Blocked):等待获取到一个排它锁

Ø 结束(Terminated):线程执行结束

五、守护线程

Ø 线程有两种一种是用户线程,一种是守护线程

Ø 垃圾回收线程是典型的守护线程,当jvm中还有非守护线程,守护线程就一直还在,知道非守护线程不存在了,守护线程才销毁

六、总结

Ø 线程提高了资源利用率

Ø 线程的实现可以通过继承Thread类,也可以通过实Runnable接口

Ø 线程中断方式有3种,常用的是interrupt方法,该方法并没有立即中断线程,只是做了一个中断标志

Ø interrupted和isInterrupt两种方法都可以查看线程中断状态,第一种查看的是当前线程的中断状态,第二种查看的该方法调用者的中断状态

Ø interrupted方法会清除中断状态,isInterrupt不会清除中断状态

Ø interrupt方法没有真正中断线程,所以可以在run方法里面判断中断状态,然后通过抛出异常或者return来中断线程

Ø 当线中断状态为true,再进入sleep会抛出异常,反之一样,sleep状态执行interrupt方法,同样会抛出异常

Ø 线程暂停容易将锁占住

Ø 线程具有优先级,可以通过方法设置线程优先级,cpu会将资源尽量给优先级高的线程,但是当优先级差别不大的时候,优先级高的不一定先执行完run方法

Ø 线程有两种,一种用户线程,一种守护线程,直到用户线程都销毁,守护线程才销毁

猜你喜欢

转载自www.cnblogs.com/qfdsj/p/8930416.html