第五章:多线程

多线程就是指一个应用程序中有多条并发执行的线索,每条线索都被称作一个线程,它们会交替执行,彼此间可以进行通信。

5.1线程的概述

每个独立执行的程序都可称为一个进程,也就是“正在运行的程序”。

5.1.2线程

每个运行的程序都是一个进程,在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序运行的一条条线索,被称为线程。操作系统中的每一个进程中都至少存在一个线程。

按照调用顺序依次往下执行,没有出现两段程序代码交替运行的效果,这样的程序称作单线程程序。如果希望程序中实现多段程序代码交替运行的效果,则需要创建多个线程,即多线程程序。

5.2.2实现Runnable接口创建多线程

通过继承Thread类实现了多线程,但是这种方式有一定的局限性。因为Java中只支持单继承,一个类一旦继承了某个父类就无法在继承Thread类,为了克服这种弊端,Thread类提供了另一个构造方法Thread(Runnable target),其中Runnable是一个接口,它只有一个run()方法。当通过Thread(Runnable target)构造方法创建线程对象时,只需为该方法传递一个实现了Runnable接口的实例对象,这样创建的线程将调用实现了Runnable接口中的run()方法作为运行代码,而不需要调用Thread类中的run()方法。

5.3 线程的生命周期及状态转换

在java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期。当Thread对象创建完成时,线程的生命周期便开始了。当run()方法中代码正常执行完毕或者线程抛出了一个未捕获的异常(Exception)或者错误(Error)时,线程的生命周期便会结束。线程整个生命周期可以分为五个阶段,分别是新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)和死亡状态(Terminated),线程的不同状态表明了线程当前正在进行的活动。

1. 新建状态(New) (不能运行)

2. 就绪状态(Runnable) 也称为可运行状态,它只具备了运行的条件,能否获得CPU的使用权开始运行,还需要等待系统的调度。
3. 运行状态(Running)开始执行run()方法中的线程执行体。
4. 阻塞状态(Blocked)一个正在执行的线程在某些特殊的情况下,如执行耗时的输入/输出操作时,会放弃CPU的使用权,进入阻塞状态。线程进入阻塞状态后,就不能进入排队队列。只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。
5. 死亡状态(Terminated)线程的run()方法正常执行完毕或者线程抛出一个未捕获的异常(Exception)、错误(Error),线程就进入死亡状态。一旦进入死亡状态,线程将不再拥有运行的资格,也不能在转换到其他状态。

5.5.3 同步方法

具体语法如下:

 Synchronized 返回值类型 方法名([参数1,………]) 

被synchronized修饰的方法在某一时刻只允许一个线程访问,访问该方法的其他线程都会发生阻塞,直到当前线程访问完毕后,其他的线程才有机会执行方法。

5.6.2 问题如何解决

唤醒线程的方法

Void wait():使当前线程放弃同步锁并进入等待,直到其他线程进入此同步锁,并使用notify()方法,或notifyAll()方法唤醒该线程为止。

Void notify():唤醒此同步锁上等待的第一个调用wait()方法的线程。

Void notifyAll():唤醒此同步锁上调用wait()方法的所有线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值