前面已經介紹了如何撰寫有關於 Java Thread 的程式了,接下來的幾天會介紹有關於 java.util.concurrent package 下面的一些 class,這些 class 如果會使用的話,對於操作 Thread 是有幫助的。
今天就介紹 Semaphore class 的部份, Semaphore class 主要用來控制 Thread 最多能被用到的次數,如果超過 Semaphore 的設定次數的話就會等待其它的執行緒執行完成,在等待的 Thread 才能進入使用。
建立 Semaphore 物件時需要在建構子裡面指定限制只能被幾個執行緒使用到的數量,程式如下:
Semaphore semaphore = new Semaphore(3);
上面的程式就是定義只能給 3 個執行緒執行到,如果超出 3 個的話就會等到其它的執行緒執行完,才會繼續執行正在等待的執行緒。
semaphore.acquire();
當呼叫 acquire 的方法時就會使用到一個資源,這時建構子定義的 3 就會減去1 就只會剩下 2 個執行緒可以執行到的資源。如果剩下 0 的話其它執行緒就會進行等待的動作。
semaphore.release();
當執行完之後要記得呼叫 release 把資源釋放掉,這時資源的數量就會加上 1,如果沒有釋放掉的話其它的執行緒就沒有辦法拿到資源,會一直等待執行。
以下是完整的程式碼如下:
import java.util.concurrent.Semaphore;
public class ThreadExample implements Runnable {
private String threadName;
private Semaphore semaphore;
public ThreadExample(String threadName, Semaphore semaphore) {
this.threadName = threadName;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
this.semaphore.acquire();
Thread.sleep(1000L);
System.out.println("thread name is:" + this.threadName);
this.semaphore.release();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
當呼叫到 run 的方法時會要求拿到一個資源這時資源的個數會減去 1 然後等到執行完畢之後會將資源釋放掉,這時資源的個數會加上 1 。
public class Main {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(3);
Thread thread1 = new Thread(new ThreadExample("thread1", semaphore));
thread1.start();
Thread thread2 = new Thread(new ThreadExample("thread2", semaphore));
thread2.start();
Thread thread3 = new Thread(new ThreadExample("thread3", semaphore));
thread3.start();
Thread thread4 = new Thread(new ThreadExample("thread4", semaphore));
thread4.start();
Thread thread5 = new Thread(new ThreadExample("thread5", semaphore));
thread5.start();
}
}
以上是主程式的呼叫,當有 3 個執行緒在執行時就會進行等待其它 2 個執行緒的執行,等待其它執行緒執行完之後才會開始執行等待的執行緒,以下是執行的結果:
thread name is:thread1
thread name is:thread2
thread name is:thread3
thread name is:thread4
thread name is:thread5
java.util.concurrent 的 package 下還有很多好用的 class 這在之後的幾天都還會繼續介紹到。