Java嚴格控制2個執行緒的交替執行次數
阿新 • • 發佈:2018-11-11
以下程式碼可以實現兩個執行緒(A和B)任意次數的交替執行,比如,A執行緒執行m次,B執行緒執行n次,A執行緒又執行m次,B執行緒又執行n次…如此交替迴圈。
首先定義一個鎖類,該類的作用是充當執行緒之間的通訊角色,並定義各個執行緒的執行次數,同時還包含了執行緒的主體執行方法,程式碼如下:
public class Lock { // 執行緒A每次執行的次數 private int aRunTimes; // 執行緒A已經執行的次數 private int aRunCount = 0; //執行緒B每次執行的次數 private int bRunTimes; // 執行緒B已經執行的次數 private int bRunCount = 0; //是否A執行緒先執行 private boolean aFist; public Lock(int aRunTimes, int bRunTimes, boolean aFist) { this.aRunTimes = aRunTimes; this.bRunTimes = bRunTimes; this.aFist = aFist; } public synchronized void methodA() { // 如果A執行緒先執行,並且A執行緒已經執行的次數小於每次需要執行的次數 if (aFist && aRunCount < aRunTimes) { System.out.println(Thread.currentThread().getName() + " 執行次數:" + aRunCount); aRunCount++; } else { notify(); //喚醒B執行緒 aFist = false; //修改標記 aRunCount = 0; //將執行緒A已經執行次數歸零,下次A執行緒執行的時候重新計數 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void methodB() { if (!aFist && bRunCount < bRunTimes) { System.out.println(Thread.currentThread().getName() + "執行次數:" + bRunCount); bRunCount++; } else { notify(); aFist = true; bRunCount = 0; try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
定義執行緒A,在run()方法種迴圈呼叫lock物件的methodA()方法
public class ThreadA implements Runnable {
private Lock lock;
public ThreadA(Lock lock){
this.lock = lock;
}
@Override
public void run() {
while(true){
lock.methodA();
}
}
}
定義執行緒B,在run()方法種迴圈呼叫lock物件的methodB()方法
public class ThreadB implements Runnable { private Lock lock; public ThreadB(Lock lock){ this.lock = lock; } @Override public void run() { while(true){ lock.methodB(); } } }
測試類:
public class Test { public static void main(String[] args){ // 此處表示每次執行緒A執行2次,執行緒B執行3次,執行緒B先執行 Lock lock =new Lock(2,3,false); // 通過構造方法將同一個lock物件傳給執行緒A和執行緒B Thread a = new Thread(new ThreadA(lock),"執行緒A"); Thread b = new Thread(new ThreadB(lock),"執行緒B"); a.start(); b.start(); }
}