1. 程式人生 > >Java嚴格控制2個執行緒的交替執行次數

Java嚴格控制2個執行緒的交替執行次數

以下程式碼可以實現兩個執行緒(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();
}

}