Java 多執行緒基本使用(二)

2021-08-28 22:16:09 字數 2210 閱讀 1070

在學習多執行緒時,如果聯絡作業系統來學習,會覺得很好理解。因為學習作業系統時候,有同步,互斥,鎖的一些概念~

8.加入執行緒

(1)join,當前執行緒暫停,等待指定的執行緒執行結束後,當前執行緒再繼續

(2)join(int),可以等待指定的毫秒之後繼續,交替繼續

9.禮讓執行緒

yield讓出cpu

10.設定執行緒的優先順序,最小的優先順序是1,最大是10,預設是5

setpriority()

11.什麼情況下需要使用同步

如果多執行緒併發,有多段**同時執行時,我們希望某一段**執行的過程中cpu不要切換到其他執行緒工作,這時就需要同步

如果兩段**是同步的,那麼同一時間只能執行一段,在一段**沒執行結束之前,不會執行另一段**

12.同步**塊

使用synchronize關鍵字加上乙個鎖物件來定義一段**,就叫做同步**塊

多個同步**塊如果使用相同的鎖物件,那麼他們就是同步的

13.同步方法

使用synchronized關鍵字修飾的乙個方法,該方法中所有的**都是同步的

非靜態的同步方法的鎖物件是this,靜態的同步方法的鎖物件是該類的位元組碼物件,即pr2.class

14.執行緒安全問題,用火車站售票例子解釋

15.死鎖:多執行緒同步時,如果同步**巢狀,使用相同鎖,就有可能出現死鎖,為了避免,不要出現同步**塊巢狀

16.一般來說,通過檢視類的原始碼,如果存在synchronized,則大部分可認為是執行緒安全的。

比如:vector是執行緒安全的,arraylist是執行緒不安全的

stringbuffer是執行緒安全的,stringbuilder是執行緒不安全的

hashtable是執行緒安全的,hashmap是執行緒不安全的

package pra_20;

public class j_39 }};

thread th2=new thread() catch (interruptedexception e)

}system.out.println("2");}}

};th1.start();

th2.start();

//9.禮讓執行緒

new mythread2().start();

new mythread2().start();

//10.設定執行緒的優先順序

thread th3=new thread()}};

thread th4=new thread()}};

th3.setpriority(10);

th4.setpriority(3);

th3.start();

th4.start();

//12.同步**塊

final pr p1=new pr();

new thread()

}}.start();

new thread()

}}.start();

//13.同步方法

final pr2 p2=new pr2();

new thread()

}}.start();

new thread()

}}.start();

//14.執行緒安全問題

new ticket().start();

new ticket().start();

new ticket().start();

new ticket().start(); }}

class ticket extends thread catch (interruptedexception e)

system.out.println("這是第"+ticket--+"張票");

}} }

}//為了實現同步方法建立的類(非靜態)

class pr2

public void pri2() }}

//為了實現同步方法建立的類(靜態)

class pr3

public static void pri2() }}

//為了實現同步**塊建立的類

class pr

} public void pri2() }}

class suo

class mythread2 extends thread

system.out.println(getname()+"~~~~"+i);

} }}

Java 多執行緒 二

執行緒安全問題 引出同步 塊 通過下面的例子,了解傳統多執行緒存在的執行緒安全隱患。需求 買票 四個視窗同時買票。class ticket implements runnable extends thread catch exception e system.out.println thread.c...

java多執行緒使用

首先說一下多執行緒的應用場景吧 eg 1 2 3 1億 最開始測試用的是1兆,但是超過了double的範圍,計算的資料不準確,用bigdecimal太麻煩了 如何快速運算出資料結果 常規演算法 public static void main string args system.out.printl...

java多執行緒學習(二)執行緒的基本方法

sleep long millis 作用是讓當前執行緒休眠指定的毫秒,使當前執行緒進入阻塞狀態,期間會讓出cpu的資源,但不會釋放已獲得的鎖.到達指定時間後,執行緒會從阻塞狀態變成 可執行狀態,重新競爭cpu的資源 static void sleep long millis 這是thread類中的靜...