題目:
1.開啟兩個線程,一個線程打印A~Z,兩一個線程打印1~52的數據。
2.實現交替打印,輸出結果為12A34B...........5152Z.
3.請用多線程方式實現。
實現思路:通過鎖(synchronized) 與wait(),notifyAll()的 或者lock、await()、signal()來實現,廢話不多說,直接上代碼:
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author admin * @create 2019-12-27-15:08 */ public class Print { public boolean letterFlag = true;//線程結束標記; public boolean numFlag = true; //數字的初始值 int num = 1; //這里A~Z的字母對應的阿拉伯數字為65~90, int letter = 65; //線程等待標記 boolean flag = true; Lock lock = new ReentrantLock(); Condition condLetter = lock.newCondition(); Condition condNum = lock.newCondition(); public void printLetter() { if(letter>90){ letterFlag =false; return; } lock.lock(); try { if (flag){ condLetter.await(); } System.out.print((char)letter); letter++; flag=true; condNum.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void printNum() { if(num>=52){ numFlag =false; return; } lock.lock(); try { if (!flag){ condNum.await(); } System.out.print(num); num++; System.out.print(num); num++; flag=false; condLetter.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public static void main(String[] args) { Print print =new Print(); new Thread(new Runnable() { @Override public void run() { while (print.numFlag){ print.printNum(); } } }).start(); new Thread(new Runnable() { @Override public void run() { while (print.letterFlag){ print.printLetter(); } } }).start(); } }
運行結果為:
12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z