JavaSE学习笔记总结day19
创始人
2024-05-29 14:14:04
0

今日内容

二、线程安全的集合
三、死锁
四、线程通信
五、生产者消费者
六、线程池

零、 复习昨日

创建线程的几种方式 1) 继承 2) 实现Runnable 3) callable接口 Future接口 4) 线程池
启动线程的方法 start()
线程的几种状态
什么是线程不安全


setName getName
Thread.currentThread()
join
sleep


synchronized

一、作业

售卖后车票

package com.qf.homework;public class Window implements Runnable {// 票(加static,被该类所有对象共享)private static int ticket = 100;// 售票任务@Overridepublic void run() {while (true) {synchronized (Window.class) {if (ticket > 0) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace( );}System.out.println(Thread.currentThread( ).getName( ) + "有余票,正在售出" + ticket);ticket--;} else {System.out.println("票已售完");return;}}}}
}
    public static void main(String[] args) {new Thread( new Window() ,"窗口1").start();new Thread( new Window() ,"窗口2").start();new Thread( new Window() ,"窗口3").start();}

二、线程安全的集合

StringBuffer是线程安全的,是因为每个方法都加上synchronized,即都是同步方法
StringBuilder没有加

image-20230303094122011

image-20230303094159112

ArrayList是线程不安全
Vector 是线程安全

image-20230303094527278

HashMap 是线程不安全
Hashtable 是线程安全

image-20230303095012216

比HashMap安全,比Hashtable快,即安全又快的集合ConcurrentHashMap[很重要]

三、死锁

死锁: 互相持有对方的锁还不释放

public class MyLock {static Object zuo = new Object();static Object you = new Object();
}
public class Boy extends Thread{@Overridepublic void run() {synchronized (MyLock.zuo){System.out.println("男朋友-拿到左筷子" );synchronized (MyLock.you) {System.out.println("男朋友-拿到右筷子,开吃" );}}}
}
public class Girl extends Thread{@Overridepublic void run() {synchronized (MyLock.you){System.out.println("女朋友-拿到右筷子" );synchronized (MyLock.zuo) {System.out.println("女朋友-拿到左筷子,开吃" );}}}
}
public class TestDeadLock {public static void main(String[] args) {new Boy().start();new Girl().start();}
}

男生先拿到zuo锁,再去获得you锁即可吃饭
但是you锁在女生那里,女生需要获得zuo锁才能吃饭
即 男生需要的you锁被女生拿着,女生需要的zuo锁被男生拿着
互相持有对方的锁,还不释放,就会出现"死锁" 程序卡死,不往下执行,持续阻塞

四、线程通信

线程通信,就是线程之间产生联系.

即通知,例如线程A执行到一定时候会停下,同时通知另外的线程B执行,
线程B执行到一定时候,也停下,通知线程A执行

以上操作需要Object类的方法

  • wait() 让当前线程等待
  • notify() 唤醒一个处于等待状态的线程

特殊的:

  • wait和notify方法需要在同步方法或者同步代码块内执行
  • wait会让当前线程进入等待状态,让出资源,其他线程可以执行

问 wait和sleep有什么区别?

答:

  • wait是Object类的方法,sleep是Thread类方法

  • wait和sleep都可以让当前线程进入阻塞状态

  • 但是wait阻塞当前线程,会让出系统资源,其他线程可执行;但是sleep阻塞当前线程,会持有锁不释放,其他线程无法执行

  • wait需要在同步方法或同步代码快中使用,但是sleep可以在同步或非同步都可以使用

ps: 搞个表格

waitsleep
不同点属于Object类中的方法,需要再同步代码块或同步方法中。属于Thread方法,可以同步或不同步的执行。
相同让线程阻塞,会让出系统资源让线程阻塞,持有锁不释放资源

问 为什么wait和notify方法要设计在Object类中?

答: 因为锁可以是任意对象,有因为wait和notify需要被 锁对象调用,所以锁对象任意,wait和notify方法也能被任意对象调用,所以就设计在Object类中,因为Object类是所有类的父类

需求: 昨天打印机方法,让print1()和print2()方法交替执行

package com.qf.notify;public class Printer {// 具体哪台打印机执行的标志private int flag = 1;// 现在使用同步方法,print1和print2方法由同一个对象打印机对象调用// print1方法和print2方法锁是同一个,是this,即打印机对象public synchronized void print1() {if (flag != 1) {try {// 锁是谁,就用谁调用wait// 当前线程就陷入等待,会让出资源释放锁this.wait();} catch (InterruptedException e) {e.printStackTrace( );}}System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("\r\n");// 干完活,修改标志flag = 2;// 通知另外一个处于等待状态的线程// 锁是谁,用谁调用方法this.notify();}public synchronized void print2() {if (flag != 2) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace( );}}System.out.print("A ");System.out.print("B ");System.out.print("C ");System.out.print("D ");System.out.print("\r\n");flag = 1;this.notify();}
}
// 测试
public class TestNotify {public static void main(String[] args) {Printer printer = new Printer( );new Thread(){@Overridepublic void run() {while (true){printer.print1();}}}.start();new Thread(){@Overridepublic void run() {while (true){printer.print2();}}}.start();}
}

换用同步代码块实现

package com.qf.notify;public class Printer {// 锁对象private Object obj = new Object();// 具体哪台打印机执行的标志private int flag = 1;// 现在使用同步方法,print1和print2方法由同一个对象打印机对象调用// print1方法和print2方法锁是同一个,是this,即打印机对象public void print1() {// 同步代码块,现在锁是字节码文件synchronized(Printer.class) {if (flag != 1) {try {// 锁是谁,就用谁调用wait// 当前线程就陷入等待,会让出资源释放锁// 用字节码锁来调用wait方法Printer.class.wait( );} catch (InterruptedException e) {e.printStackTrace( );}}System.out.print("1 ");System.out.print("2 ");System.out.print("3 ");System.out.print("4 ");System.out.print("\r\n");// 干完活,修改标志flag = 2;// 通知另外一个处于等待状态的线程// 只能唤醒在此对象监视器(加过锁的)上等待的单个线程.// 如果没有加锁,直接调用该方法唤醒线程,会报错IllegalMonitorStateException// 锁是谁,用谁调用方法Printer.class.notify( );}}public  void print2() {synchronized( Printer.class) {if (flag != 2) {try {Printer.class.wait( );} catch (InterruptedException e) {e.printStackTrace( );}}System.out.print("A ");System.out.print("B ");System.out.print("C ");System.out.print("D ");System.out.print("\r\n");flag = 1;Printer.class.notify( );}}
}
- void start() 开启线程
- void run() 执行线程的方法- run() 方法是start开启线程后,JVM自动调用
- void setName(String name) 给线程设置名字
- String getName() 获得线程的名字
- static Thread currentThread() 返回当前正在执行的线程对象
- setPriority(int priority) 设置优先级- 级别是1-10 ,默认是5
- getPriority() 获得优先级
- join()  加入线程,等待该线程终止
- join(int milles) 加入线程,最大等待直到毫秒数
- void setDaemon(boolean on) 设置守护线程
- static void yield() 礼让线程,暂停当前线程,让其他线程执行
- static void sleep(long milles) 线程休眠
- void stop() 结束当前线程,线程死亡

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NV4f7qWm-1678065007263)(D:\前锋学习笔记\笔记\image-20230306090803972.png)]

相关内容

热门资讯

朗诗出售美国业务予Apollo... 观点网讯:5月14日,据全球地产投资笔记,朗诗美国公司Landsea Homes Corporati...
夏季集中供冷来了!山东一地5月... 近日,北方气温逐渐攀升!记者自济南能源集团所属济南市冷热联供有限公司(以下简称“冷热联供公司”)了解...
共话城乡融合温暖故事 转自:嘉兴日报 ■记者 蒋彧淼 通讯员 汪亚玲本报讯 近日,在蓬莱公园南门广场,秀洲区新塍镇举办了“...
民进省委会调研组来铜开展大气污...   本报讯 (记者 冯青)5月12日至13日,省人大常委、民进省委会专职副主委李正升带队来铜开展大气...
美联储,突变!事关降息! 美联储的降息预期生变。在贸易紧张局势缓和后,华尔街大行和利率市场上的交易员们纷纷降低了对美联储年内降...
广东省原省长卢瑞华逝世 转自:扬子晚报中国共产党的优秀党员,久经考验的忠诚的共产主义战士,中共广东省委原副书记、广东省原省长...
陕西移动在咸阳开通全省首个万兆...   本报讯(记者 赵毅)近日,陕西移动咸阳分公司携手咸阳市数据局,在咸阳高新区装备制造产业园举办咸阳...
受美关税政策等影响 德国经济将...   德国经济研究所13日发布的最新报告称,德国经济仍处于衰退之中,报告预测今年德国经济产出将下降0....
变“沉睡资源”为“增收源泉” 转自:湖州日报  记者  施妍  本报讯  记者从市水利局获悉,《浙江省水利厅关于推进农村集体水库山...
央地综合施策 激活消费“主引擎... 新华财经上海5月14日电 消费是我国经济增长的重要引擎,一季度消费的贡献率达到51.7%,比去年全年...
市委理论学习中心组集体学习会议...   本报讯 5月12日,市委理论学习中心组举行集体学习,认真学习习近平总书记关于坚持总体国家安全观、...
中北路社区治理探索|“骑手友好... 转自:北京日报客户端酒仙桥街道中北路社区共有5个小区,其中芳园里面积最大,楼栋最多,以前骑手进小区常...
寻常业务 触发“意外之喜” 转自:南湖晚报  N龚 萱   “没想到你们的专业服务不仅解决了我的难题,还让我...
小布丁·早安丨地名里的重庆:在... 重庆城东,山水之间岛屿星罗,湖光潋滟在碧波之上自然绘就一个长达千米的魏碑“寿”字这一笔写尽山川,也写...
俄美将举行新一轮双边谈判 据俄罗斯媒体报道,当地时间13日,俄罗斯外交部副部长里亚布科夫表示,俄美两国将举行新一轮双边谈判,不...
在动荡世界中为人类前途命运挺膺...   □新华社记者 阚静文 刘品然 柳丝  克里姆林宫灯光璀璨,莫斯科红场旌旗漫卷,《喀秋莎》婉转悠扬...
肖风给区块链创业者的一堂课:我... 作者 | 肖风吴说获万物岛授权转载大家好,英木跟我说,因为市场周期、环境不好,大家都开始思考:“是不...
【5·15专栏】防非小故事 来源:先锋期货(转自:先锋期货) .app-kaihu-qr { text-...
百济神州(06160.HK):... 格隆汇5月14日丨百济神州(06160.HK)发布公告,2018年12月7日,公司股东批准第二份经修...
智通港股通资金流向统计(T+2... 5月9日,建设银行(00939)、华虹半导体(01347)、招商银行(03968)南向资金净流入金额...