請撰寫一個程式,使用兩個執行緒分別輸出數字和字母,要求輸出的結果為:1A2B3C4D5E6F7G8H9I10J,
提示:可以使用Java中的wait()和notify()方法來實作執行緒間的通信,
public class NumberLetterPrinter { // 定義一個靜態的鎖物件 private static final Object lock = new Object(); // 定義一個計數器變數 private static volatile int count = 1; public static void main(String[] args) { // 創建第一個執行緒,輸出數字 new Thread(() -> { // 使用同步塊,鎖定鎖物件 synchronized (lock) { // 當計數器變數小于等于10時,一直回圈輸出數字 while (count <= 10) { // 輸出數字并將計數器變數加1 System.out.print(count++); try { // 喚醒另一個執行緒并進入等待狀態 lock.notify(); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 退出回圈后,釋放鎖物件 lock.notify(); } }).start(); // 創建第二個執行緒,輸出字母 new Thread(() -> { // 使用同步塊,鎖定鎖物件 synchronized (lock) { // 當計數器變數小于等于10時,一直回圈輸出字母 while (count <= 10) { // 輸出字母并將計數器變數加1 System.out.print((char) (count + 64)); try { // 喚醒另一個執行緒并進入等待狀態 lock.notify(); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 退出回圈后,釋放鎖物件 lock.notify(); } }).start(); } }
代碼執行流程如下:
-
程式啟動后,創建了兩個執行緒分別輸出數字和字母,
-
兩個執行緒都使用了同步塊,并鎖定了同一個靜態的鎖物件
lock,以保證執行緒安全, -
第一個執行緒進入回圈后,判斷計數器變數
count是否小于等于10,由于count初始值為1,因此第一次進入回圈, -
第一個執行緒輸出數字并將計數器變數加1,此時
count變數為2, -
第一個執行緒呼叫
lock.notify()方法喚醒第二個執行緒,然后呼叫lock.wait()方法進入等待狀態, -
第二個執行緒被喚醒后,進入同步塊,判斷計數器變數
count是否小于等于10,由于count變數為2,因此進入回圈, -
第二個執行緒輸出字母并將計數器變數加1,此時
count變數為3, -
第二個執行緒呼叫
lock.notify()方法喚醒第一個執行緒,然后呼叫lock.wait()方法進入等待狀態, -
第一個執行緒被喚醒后,進入同步塊,判斷
-
計數器變數
count此時為3,因此第一個執行緒進入回圈,輸出數字3并將計數器變數加1,此時count變數為4, -
第一個執行緒呼叫
lock.notify()方法喚醒第二個執行緒,然后呼叫lock.wait()方法進入等待狀態, -
第二個執行緒被喚醒后,進入同步塊,判斷計數器變數
count是否小于等于10,由于count變數為4,因此進入回圈, -
第二個執行緒輸出字母并將計數器變數加1,此時
count變數為5, -
第二個執行緒呼叫
lock.notify()方法喚醒第一個執行緒,然后呼叫lock.wait()方法進入等待狀態, -
第一個執行緒被喚醒后,進入同步塊,以此類推,直到回圈輸出數字和字母的次數都達到10次為止,
-
兩個執行緒都執行完回圈后,程式結束,
總體來說,這段代碼的執行流程可以看作是兩個執行緒交替輸出數字和字母,直到回圈次數達到10次為止,其中,使用了同步塊和鎖物件來保證執行緒安全,使用wait()和notify()方法來實作執行緒之間的通信,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548949.html
標籤:其他
下一篇:Java 函式式編程
