Thread API
說明
自己滾去看文檔
CPU線程調度
每一個線程的優先使用權都是系統隨機分配的,人人平等
誰先分配到就誰先用
也可以耍賴,就是賦予某一個線程擁有之高使用權:優先級
這樣的操作就叫做線程調度
最基本的是系統輪流獲得
java的做法是搶占CPU資源
優先級在java中是1-10,數字最大優先級越高
main()也是一個線程,被叫做主線程,他的值是5
main是優先執行的main,就是好像把別人的值設置的很大的時候也是先跑的main
但是有時候會發現自己設置的好像不管用,這是因為這里優先級的設置需要操作系統的支持,系統不一樣有可能導致不準,因為執行的很快
所以以后在做多線程的時候,不要依賴多線程調度,除非是你這個線程執行的時間很長的時候,這個時候才能體會出一點多線程調度的樣子,因為CPU執行的非常快,雖然你把優先級分好了,但是好像沒啥卵用
public class Demo {public static void main(String[] args) {Thread maxPriority = new Thread(new MAXPriority(), "maxPriority");Thread minPriority = new Thread(new MINPriority(), "minPriority");maxPriority.setPriority(Thread.MIN_PRIORITY);minPriority.setPriority(Thread.MAX_PRIORITY);maxPriority.start();minPriority.start();}
}
運行結果確實沒啥卵用
線程插隊
public class Demo {public static void main(String[] args) {Thread thread_join = new Thread(new MAXPriority(), "MAXPriority");thread_join.start();for (int i = 0; i < 10; i++) {System.out.println(Thread.currentThread().getName());if (i == 3) {try {thread_join.join();} catch (InterruptedException e) {e.printStackTrace();}}}}
}
使用join可以實現無恥的插隊
線程休眠
try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}
線程休眠, 讓線程先睡一會再說
線程讓步
有一種搶地主的感覺,說啥呢,這叫孔融讓梨
public class MAXPriority implements Runnable {@Overridepublic void run() {for (int i = 0; i < 10; i++) {if (i == 5) {Thread.yield();System.out.println(Thread.currentThread().getName() + "現在開始線程讓步");}System.out.println(Thread.currentThread().getName());}}
}
可以看到1執行了5次之后就開始執行2
打印沒有讓步快
因為線程太快了
線程狀態還是斗地主吧
線程狀態
New
新建 -----> new Thread
Runbale
可運行 --------> .start
Blocked
阻塞
Waiting
等待
Timed waiting
計時等待
Terminated
終止
線程通信
線程調度高度依賴于操作系統
在任務管理器中可以設置進程的優先級
在線程調度中,一個線程結束之后需要通知另外兩個線程,來告訴他我結束了,你上吧
有一個等待喚醒機制
無非就是誰等待誰被喚醒
package com.google.dome;public class Condom {public boolean isStatus = false;
}
package com.google.dome;public class Customer extends Thread {private Condom condom;public Customer(Condom condom) {this.condom = condom;}@Overridepublic void run() {while (true) {synchronized (condom) {// 是否擁有庫存,如果沒有就打電話給廠商,我們等if (condom.isStatus == false) {try {condom.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "我買完了快點生產");}condom.isStatus = false;System.out.println(Thread.currentThread().getName() + "我買完了,你快點生產,我通知你了");condom.notify();}}}
}
package com.google.dome;public class Producer extends Thread {private Condom condom;public Producer(Condom condom) {this.condom = condom;}@Overridepublic void run() {while (true) {// 對商家來說是是否有貨,如果有貨的話就等著synchronized (condom) {if (condom.isStatus == true) {try {condom.wait();} catch (InterruptedException e) {e.printStackTrace();}}condom.isStatus = true;System.out.println(Thread.currentThread().getName() + "我生產完了,你快點買,我通知你了");condom.notify();}}}
}
使用condom.wait
進行線程等待并且condom.notify
通知其他的線程
鎖的對象為什么能使用.wait
和.notify
呢?好奇怪
如果有多個線程的話,就可以喚醒所有的線程.notifyAll
frank竟然不打算往下講, 這些就屬于是并發編程的事了
說是什么點到為止
進程
java中提供了方法去操作進程,了解一下就行
這個已經涉及到很底層的東西,frank說不能再講了,因為就越來越復雜了,現在的知識點還是有限的
這樣做就需要用到泛型編程,這個泛型編程到底是個啥東西
大公司的并發操作有時候使用的是go
對于新手而言已經是超乎極限了
有一本書叫做java并發編程的藝術
java核心技術
你要是會這個肯定是優勢,但是實習生不怎么要求這個
但是牛逼的實習生肯定得會
得寫框架,寫好算法就是基礎任務
想進大廠就得多會一點
現在不要把這個放在重點上面,否則的話肯定會浪費很多時間
不要把時間浪費在無關的事情上面
micro_frank