Day22

Day22
一、多线程
1、实现方式:
1)继承Thread类, 重写run(); void
2)实现Runnable接口 重写run(); void
3)实现Callable接口 重写call();带返回值,返回值类型和泛型保持一致。
4)线程池 实现Callable接口 重写call();
2、将线程从运行状态到阻塞状态的四种方法:
1)sleep() :使线程睡眠,加入时间的单位为毫秒,可以自动解锁。
2)join() :等待线程结束(不结束一直等待)。
3)yield():把当前线程挂起,等其他线程结束,再执行。
4)wait():让线程处于阻塞状态,唤醒时调用notify()方法或 notifyAll()。
3、将线程从阻塞状态到运行状态的方法:
调用interrupt() 方法。
4、sleep()和wait()方法的区别
Sleep() wait()
类 Thread类 Object类
唤醒方式 interrupt() notify()方法或 notifyAll()
能否自动解锁: 能 不能
5、锁
作用:提高效率。
分类:
1)synchronized 关键字
如何使用:
1.可以锁方法
2.可以去锁一个代码块
形式: synchronized(放一个对象){
代码
}
2)Lock
使用:Lock 你想在哪加锁就在哪加锁,想在哪解锁就在哪解锁(可以跨方法,类)。
优点:相比 synchronized 更灵活。
3)读写锁:保证数据安全的情况下,提供效率。
读锁:可以有读锁 不能有写锁 。
写锁:不能有其他锁 。
6、死锁:
如何解决死锁问题:
哲学家就餐问题:
筷子类public class KuaiZi {
private String kname;
private boolean b;
public boolean isB() {
return b;
}
public void setB(boolean b) {
this.b = b;
}
public String getKname() {
return kname;
}
public void setKname(String kname) {
this.kname = kname;
}
public KuaiZi(String kname) {
this.kname = kname;
}
@Override
public String toString() {
return kname;
}
哲学家类
public class ZheXueJia extends Thread{
private String zname;
private KuaiZi left;
private KuaiZi right;
public String getZname() {
return zname;
}
public void setZname(String zname) {
this.zname = zname;
}
public ZheXueJia(String zname, KuaiZi left, KuaiZi right) {
this.zname = zname;
this.left = left;
this.right = right;
}
public void run(){
//想解决死锁问题(降低死锁的概率):需要在这些人中有人做出让步
if(zname.equals(“张三”)){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized(left){
//判断左侧筷子是否使用
if(!left.isB()){
//表示使用状态
System.out.println(zname+“拿了”+left);
left.setB(true);
//判断学者右侧的筷子是否使用
synchronized(right){
if(!right.isB()){
System.out.println(zname+“拿了”+right);
right.setB(true);
System.out.println(zname+“可以吃饭了”);
}
System.out.println(“吃完了”);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
left.setB(false);
right.setB(false);
}
}
}
}
}
测试类
public class Test {
public static void main(String[] args) {
KuaiZi zk1 = new KuaiZi(“A”);
KuaiZi zk2 = new KuaiZi(“B”);
KuaiZi zk3 = new KuaiZi(“C”);
KuaiZi zk4 = new KuaiZi(“D”);
KuaiZi zk5 = new KuaiZi(“E”);
ZheXueJia zxj1 = new ZheXueJia(“张三”,zk1, zk2);
ZheXueJia zxj2 = new ZheXueJia(“李四”,zk2, zk3);
ZheXueJia zxj3 = new ZheXueJia(“王五”,zk3, zk4);
ZheXueJia zxj4 = new ZheXueJia(“赵六”,zk4, zk5);
ZheXueJia zxj5 = new ZheXueJia(“孙七”,zk5, zk1);
Thread t1 = new Thread(zxj1);
Thread t2 = new Thread(zxj2);
Thread t3 = new Thread(zxj3);
Thread t4 = new Thread(zxj4);
Thread t5 = new Thread(zxj5);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值