JAVA多线程机制

JAVA多线程的实现

JAVA有两种方法创建线程
(1)继承Thread类
(2)实现Runnable接口
这两种方法都要用到Thread类以及相关方法

Thread类

是一个具体的类,不是抽象类,封装了线程的行为
利用Thread类创建一个线程,必须创建一个从Thread类导出的新的子类,必须覆盖Thread的run()方法来完成线程的工作
当线程启动时必须调用Thread的start()函数

Runnable接口

该接口只有一个函数run(),此函数必须由实现了此接口的类实现
当使用该接口时,不能直接创建所需类的对象并运行它,必须从Thread类的一个实例内部运行它

既然有了Thread类,为什么还需要Runnable接口?
JAVA是单继承多实现,一个JAVA类只能继承一个父类,但可以同时实现多个接口。如果一个类已经继承了一个其他的父类,又要实现多线程时,那么就不能继承Thread类来实现,而要通过Runnable接口定义多线程

多线程程序编写关键操作

(1)定义用户线程的run()方法
(2)用new创建对象,建立用户线程实例
(3)启动线程,调用线程对象的start()方法

利用Thread子类创建线程

写一个子类继承Thread类并覆盖其中的run方法,run中的代码就是线程要实现的功能;
创建子类对象;
start方法启动线程

Runnable接口创建线程

定义一个Thread类对象,利用Thread构造方法,将本类作为参数传递给Thread对象

互斥

当多个线程需要访问同一资源,而这一资源在某一时刻只允许一个线程访问,则这些线程是互斥的

同步

多个线程需要访问同一资源,而且需要相互配合才能正常工作,则这些线程运行时就是一种同步关系

临界区

存放共享资源的区域一次只允许一个线程进入,该区域被称为临界资源。线程在访问共享资源前需要进行检查,看自己能否对该资源访问。如果有权访问,还需要阻止其他线程进入该区域

死锁

多个线程相互等待其他线程释放资源,且所有线程都不能释放自己所占用的资源,从而导致相关线程处于永远等待的状态

信号量

用于解决进程间的互斥和同步
信号量的设置必须使用PV原语

PV原语方法及关键字

public final void wait() 告知被调用的线程放弃管程进入睡眠,直到其他线程进入相同管程并调用notify(),将本线程转入阻塞状态

public final void notify() 恢复相同对象中第一个调用wait的线程

public final void notifyAll() 恢复相同对象中所有调用wait的线程,具有最高优先级的线程最先运行

synchronized 标志被同步使用的资源,系统为资源分配管程,保证在某一时间内,只有一个线程对象在享有这一资源,也被称为对象锁

线程互斥步骤

设置一个各个线程共享的信号量,值为true或false
线程需要访问共享资源前,先检测信号量的值。如果不可用,则调用wait()转入等待状态
如果可用,则改变信号量的状态,不让其他线程进入
访问完共享资源后,再修改信号量状态,允许其他线程进入
调用notify()或notifyAll(),唤醒其他等待的线程

线程的同步

为了实现线程之间严格交替运行,需要对线程进行同步控制
两个需要同步的线程会根据信号量的值,判断自己能否进入临界区。比如,一个线程只有当信号量为真时才能进入,而另一个则是假时进入
最后用对象名.notify()的当时唤醒指定的某线程类创建的线程对象

生产者消费者问题

设计一个公共类,并用该类创建一个对象,信号量和共享资源都以静态成员变量的形式存在于对象中。无论哪个线程对象访问的都是同一个信号量和共享资源
同样将生产方法和消费方法都封装到这个公共类中
信号量是介于[0,BUFFERSIZE]之间的整型数,因为缓冲区允许连续多个生产者或消费者线程进入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值