Java 關於執行緒的一些使用
public class Demo {
public static void main(String[] agr) throws Exception {
Demo demo = new Demo();
demo.test();
}
//執行緒的wait,notify必須和synchronized一起使用
//即,當前執行緒拿屬於object的鎖之後,就可以呼叫wait讓此執行緒進入等待狀態,然後丟擲鎖,等待其他執行緒那到object的鎖之後喚醒
//掛在object上的執行緒,如果有多個執行緒掛在object一個物件上那麼notify只會喚醒一個執行緒
public Object object = new Object();
public void test() throws InterruptedException {
new Thread() {
@Override
public void run() {
synchronized (object) {
L.d("執行緒1進入等待狀態");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
L.d("執行緒1繼續執行");
}
}
}.start();
new Thread() {
@Override
public void run() {
synchronized (object) {
L.d("執行緒2進入等待狀態");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
L.d("執行緒2繼續執行");
}
}
}.start();
new Thread() {
@Override
public void run() {
synchronized (object) {
L.d("執行緒3進入等待狀態");
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
L.d("執行緒3繼續執行");
}
}
}.start();
Thread.sleep(1000);
synchronized (object) {
object.notify();
}
}
}
如果像下面這個沒有拿到鎖就調起wait就會丟擲IllegalMonitorStateException異常
new Thread() {
@Override
public void run() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
或者是這樣,雖然拿到了object的鎖但是並沒有掛起在object這個物件上就也會丟擲異常
new Thread() {
@Override
public void run() {
synchronized (object){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
上面兩種直接呼叫的wait是將自己直接掛在Thread本類這個物件上所以要進行拿到本類物件的鎖才可以,像下面這樣就不會丟擲異常
public void test() throws InterruptedException {
Thread thread = new Thread() {
@Override
public synchronized void run() {
L.d("執行緒開始");
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
L.d("執行緒完成等待");
}
};
thread.start();
Thread.sleep(1000);
synchronized (thread) {
thread.notify();
}
}
有關執行緒的狀態
NEW | 剛剛建立的執行緒尚且沒有執行 |
RUNNABLE | 正在執行中的執行緒 |
WAITING | 執行緒等待中 |
TIMED_WAITING | 計時等待,呼叫wait(long timeout)之後所處的狀態 |
BLOCKED | 阻塞狀態,synchronized的鎖已經被其他執行緒拿到而沒有釋放,此時執行緒被阻塞在synchronized |
TERMINATED | 終止狀態,執行緒執行完成 |
另外如果執行緒呼叫sleep是不會釋放已經拿到的synchronized鎖,如果是呼叫wait方法則會釋放已經到的synchronized鎖
關於thread.join()方法的使用,如果在a執行緒中呼叫了b執行緒的join方法,那麼a執行緒就會進入等待直至b執行緒執行完成才會繼續執行,用網上的專業一點的說法就是將執行緒由並行轉為序列,join內部呼叫的就是wait方法,
例子:
public void test() {
Thread thread1 = new Thread() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
L.d("執行緒1 : " + i);
}
}
};
thread1.start();
Thread thread2 = new Thread() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
L.d("執行緒2 : " + i);
try {
if (i == 5) {
thread1.join();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
thread2.start();
}
join方法的原始碼:
public final synchronized void join(long millis) throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0;
if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}
相關文章
- java基礎 關於執行緒安全Java執行緒
- java 多執行緒(關於Thread的講解)Java執行緒thread
- Java多執行緒-執行緒池的使用Java執行緒
- 關於程式和執行緒 自我的一些總結執行緒
- 關於Java多執行緒的執行緒同步和執行緒通訊的一些小問題(順便分享幾篇高質量的博文)Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- JAVA執行緒池的使用Java執行緒
- 關於Java併發多執行緒的一點思考Java執行緒
- 對Java多執行緒的一些理解Java執行緒
- java使用多執行緒Java執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 關於redis單執行緒的分析Redis執行緒
- 關於執行緒設計的感受執行緒
- Java多執行緒的使用(二)Java執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- 關於執行緒池的面試題執行緒面試題
- 關於執行緒的幾個函式執行緒函式
- Java執行緒池的使用和原理Java執行緒
- JAVA執行緒池的原理及使用Java執行緒
- Java多執行緒——synchronized的使用示例Java執行緒synchronized
- 直播app開發中,關於執行緒需要了解的一些事APP執行緒
- Java面試中,一些常見的有關多執行緒問題!Java面試執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- 詳解執行緒池的作用及Java中如何使用執行緒池執行緒Java
- Android小知識-Java多執行緒相關(Lock使用)AndroidJava執行緒
- 關於執行緒池你不得不知道的一些設定執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- Java優雅關閉執行緒池Java執行緒
- Java多執行緒相關知識Java執行緒
- python關於執行緒的一點介紹Python執行緒
- 關於js執行緒問題的解讀JS執行緒
- Java多執行緒Thread類使用Java執行緒thread
- Java執行緒池使用說明Java執行緒
- 如何優雅的關閉Java執行緒池Java執行緒
- 對於es執行緒池使用的思考執行緒
- JAVA - 基於Socket的多執行緒通訊Java執行緒