Semaphoreのサンプル

こないだのスレッド入門のときに見せてたサンプル。
ブログ用に再構成。「電車」が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) {
            }
        }
    }
}