Java 執行緒問題

2021-06-08 12:06:17 字數 2063 閱讀 8835

1、生產者消費者問題

wait() 必須在synchronized 函式或者**塊裡面

wait()會讓已經獲得synchronized 函式或者**塊控制權的thread暫時休息,並且喪失控制權

這個時候,由於該執行緒喪失控制權並且進入等待,其他執行緒就能取得控制權,並且在適當情況下呼叫notifyall()來喚醒wait()的執行緒。

需要注意的是,被喚醒的執行緒由於已經喪失了控制權,所以需要等待喚醒它的執行緒結束操作,從而才能重新獲得控制權。

所以wait()的確是馬上讓當前執行緒喪失控制權,其他的執行緒可以乘虛而入。

此例中:

當產品倉庫滿的時候,生產者執行緒需要wait(),從而放棄對產品倉庫的控制。

這個時候消費者執行緒就可以進來了而取得倉庫的控制權。一旦消費者消費了產品,那麼倉庫就不滿了。

這個時候消費者執行緒就要notifyall()生產者執行緒,讓等待的生產者執行緒喚醒。

但是生產者被喚醒後不能馬上進行生產,因為它在wait()的時候已經喪失了對倉庫的控制權,所以就需要等待消費者執行緒結束操作,

才能重新取得倉庫的控制權,再進行生產。

所以特別注意的是,notifyall()並不是讓當前執行緒馬上讓出控制權,而只是讓其他wait()當中的執行緒喚醒而已,

所以對不起,儘管我喚醒你,可你必須還是要等我用完倉庫才能進來。這點必須清楚。

相反,倉庫如果空的時候,消費者執行緒就會wait(),然後等待生產者執行緒來生產產品,生產者程序乘虛而入後,讓生產者執行緒生產產品

並且喚醒消費者執行緒。這個情況跟上面就類似了。

package threadproblems;

public class producerconsumer

}class producer implements runnable

public void run() catch (interruptedexception e)

} }}class consumer implements runnable

public void run() catch (interruptedexception e)

} }}class basket catch (interruptedexception e)

} this.notify();

index--;

system.out.println("編號: " + basket[index] + " 被消費");

return basket[index];

} public synchronized void push(int i) catch (interruptedexception e)

} this.notify();

basket[index] = i;

system.out.println("編號: " + i + " 被生產");

index++;

}}

2、造乙個死鎖的程式

package threadproblems;

public class testdeadlock implements runnable catch (interruptedexception e)

synchronized (o2)

}} if (flag == 2) catch (interruptedexception e)

synchronized (o1)

}} }

public static void main(string args)

}

3、使用三個執行緒列印分別列印a、b、c   10次    保持abc的順序不變

package threadproblems;

public class printabctentimes

}class printer implements runnable

public void run() else catch (interruptedexception e) }}

}} }

}

java多執行緒問題

一提到多執行緒,大家都會想到多執行緒的實現方式之類的一些東西,但是僅僅是知道這些,下面給大家分享一道常見面試題,理解了這道題,那應該會對多執行緒更加深一些了解。問題 子執行緒執行10次,主線程執行10次,然後子執行緒執行10次,主線程執行10次,迴圈20次,寫出程式 大概就是這樣的。package ...

java中線程問題

24.09 多執行緒 獲取名字和設定名字 掌握 1.獲取名字 通過getname 方法獲取執行緒物件的名字 2.設定名字 通過建構函式可以傳入string型別的名字 new thread start new thread yyy start 通過setname string 方法可以設定執行緒物件的...

java多執行緒問題,執行緒交替執行

兩個執行緒,乙個列印1 100的奇數,乙個列印1 100的偶數 要求 執行緒1列印5個之後,執行緒2開始列印,執行緒2列印5個之後,執行緒1再開始列印,以此迴圈。package threadtest public class test1 catch interruptedexception e 當s...