多執行緒基礎
并行與并發
-
并發是指一個處理器同時處理多個任務,
-
并行是指多個處理器或者是多核的處理器同時處理多個不同的任務,
打個比方:在并發的狀態下,餐廳里只有一個廚師,盡管他做事利索,餐廳的客人等待每道菜的時間都不會太久,沒有客人覺得上菜慢,但對于廚師,在某個時間點上,他只能炒某一桌客人的菜,并行則是多個廚師同時處理客人的訂單,
執行緒與行程
現代作業系統都支持多任務并發執行:你可以在打開音樂播放器聽歌的同時打開word進行編輯,這種情況我們稱為行程級的并發,如果是在一個執行緒中同時執行多個任務,則稱這些任務為執行緒,(作業系統可以通過背景關系切換的方式實作并發)
創建執行緒
繼承Thread類,實作run方法
public class Thread0 extends Thread {
@Override
public void run() {
System.out.println("extends thread");
}
public static void main(String[] args) {
Thread thread0=new Thread0();
thread0.start();
}
}
實作Runnable介面,實作run方法
實際上Thread類就是一個Runnable介面的實作類,

“黑紙白字”寫的清清楚楚??
public class Thread1 implements Runnable {
@Override
public void run() {
System.out.println("implements Runnable");
}
public static void main(String[] args) {
//兩種皆可
new Thread(new Thread1()).start();
//
Thread1 thread1=new Thread1();
Thread thread=new Thread(thread1);
thread.start();
}
}
雖然我們通過繼承Thread類來創建執行緒,但并不推薦這種做法,因為Java是不支持多繼承的,你這個類繼承了Thread就無法再繼承別的類了,這可能給以后的修改帶來麻煩,相比之下,使用Runnable介面要靈活的多,
需要注意的是,同一個執行緒只能呼叫一次start方法,如果直接呼叫run方法會變成串行執行,
比較違反直覺的是,main執行緒可能早于子執行緒結束,感興趣可以自己驗證一下,實際上在多執行緒種違反直覺的并不止這一個,之后的博文會講到,這也是人們頭疼之所在,
守護執行緒
守護執行緒是一種特殊的執行緒,聽起來跟天使奶媽差不多的,你的感覺是對的,一個經典的守護執行緒就是Java的垃圾回收器,
總的來說:當同一個應用程式中沒有其他執行緒運行時,守護執行緒才運行(它的優先級往往很低),當其是程式中唯一運行的執行緒時,程式會在它結束之后終止,
sleep和wait的區別
最主要的區別就是雖然兩者都會讓出CPU但sleep不會釋放鎖,wait會釋放鎖,
其他的區別有
- sleep來自Thread類,wait來自Object類
- sleep需要捕獲例外
- wait只能在synchronized方法或者synchronized塊中使用
工廠類創建執行緒
使用工廠類可以將物件的創建集中化,更易于控制,
-
更容易修改類
-
方便限制創建物件的數目
-
方便對創建的物件進行統計
這里僅給出簡單的實作
public class MyThreadFactory implements ThreadFactory {
@Override
public Thread newThread(Runnable runnable) {
Thread t=new Thread(runnable);
return t;
}
public static void main(String[] args) {
MyThreadFactory factory=new MyThreadFactory();
Thread1 thread1=new Thread1();
System.out.println("the thread start");
Thread thread;
for(int i=0;i<10;i++){
thread=factory.newThread(thread1);
thread.start();
}
}
}
參考:
- https://www.cnblogs.com/plmnko/archive/2010/10/15/1851854.html
- http://concurrent.redspider.group/article/01/1.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152382.html
標籤:Java
下一篇:mybatis例外集之Cannot determine value type from string 'xxx'
