こないだのスレッド入門のときに見せてたサンプル。
ブログ用に再構成。「電車」が3つずつ動きます。
Semaphoreは、同時に実行できるスレッド数を制限できます。
このサンプルでは3つに制限しています。
static Semaphore semaphoe = new Semaphore(3);
セマフォのロック取得はaquireメソッド
semaphoe.acquire();
セマフォの開放はreleaseメソッド
semaphoe.release();
ということでソース
import java.awt.*; import java.util.concurrent.Semaphore; import javax.swing.*; public class SemaphoreSample { static Semaphore semaphoe = new Semaphore(3); public static void main(String args[]) { JFrame f = new JFrame("Semaphoreサンプル"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLayout(new GridLayout(0, 1)); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); f.setBounds((screenSize.width-400)/2, (screenSize.height-300)/2, 400, 300); for(int i = 0; i < 10; ++i){ JTextField tf = new JTextField(); f.add(tf); Runner r = new Runner(); r.tf = tf; new Thread(r).start(); } f.setVisible(true); } private static class Runner implements Runnable{ JTextField tf; @Override public void run(){ try { String tr = "電車>"; for(int i = 0; i < 50; ++i){ tf.setText(tr); tr = " " + tr; Thread.sleep(50); } try{ semaphoe.acquire();//ここから先は同時に3つまで for(int i = 0; i < 50; ++i){ tf.setText(tr); tr = " " + tr; Thread.sleep(50); } }finally{ semaphoe.release(); } } catch (InterruptedException ex) { } } } }