生産者とブローカーと消費者のシミュレーション

戻る

コマンドラインから、下記のように入力します。

$ javaws http://asistobe851.hp.infoseek.co.jp/JWS/P2C.jnlp

あるいはブラウザから直接上記URLをたたきます。

アプレットから実行する場合はこちら。

::::::::::::::
BlackItem.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class BlackItem extends Item {

    public BlackItem() {
        setColor( Color.black );
    }

}
::::::::::::::
Broker.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Broker implements Runnable {

    private MyPanel panel = null;
    private Producer producer = null;
    private StockPoint sp = null;
    private Consumer consumer = null;

    public Broker( MyPanel panel, Producer producer, StockPoint sp, Consumer consumer ) {
        this.panel = panel;
        this.producer = producer;
        this.sp = sp;
        this.consumer = consumer;

        new Thread( this ).start();
    }

    public void inputToWarehouse() {
        Deliverer deliverer = new Deliverer( panel );
        deliverer.setFrom( producer );
        deliverer.setTo( sp );

        try {
            deliverer.accept();
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }

    public void outputFromWarehouse() {
        Deliverer deliverer = new Deliverer( panel );
        deliverer.setFrom( sp );
        deliverer.setTo( consumer );

        try {
            deliverer.accept();
        } catch ( Exception e ) {
            e.printStackTrace();
        }

    }

    public void run() {
        while ( true ) {

            if ( consumer.isUnderThreshold() ) {
                outputFromWarehouse();
            }
            if ( sp.isUnderThreshold() ) {
                inputToWarehouse();
            }

            try {
                Thread.sleep( 500 );

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }
}
::::::::::::::
Consumer.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Consumer extends MyQueue implements Runnable {

    public Consumer( int queueSize ) {
        super( queueSize );

        new Thread( this ).start();
    }

    /** 消費する */
    public void consume() {
        try {
            dequeue();
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }

    public void paintComponent( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;

        g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON );

        g2.setColor( Color.green );
        g2.fillRect( 0, 0, getWidth(), getHeight() );

        int yPos = getHeight();
        Iterator iterator = queue.iterator();
        while ( iterator.hasNext() ) {
            Item item = ( Item ) iterator.next();

            g2.setColor( item.getColor() );
            int size = item.getSize();
            g2.fillOval( 0, yPos - size, size, size );

            yPos -= size;
        }
    }

    public void run() {
        while ( true ) {
            consume();
            try {
                Thread.sleep( 750 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

}

::::::::::::::
Deliverer.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Deliverer implements Runnable {

    private MyQueue from;
    private MyQueue to;
    private Item item = null;
    private MyPanel panel;
    private JPanel cargo;

    public Deliverer( MyPanel panel ) {
        this.panel = panel;
    }

    public void setFrom( MyQueue from ) {
        this.from = from;
    }

    public void setTo( MyQueue to ) {
        this.to = to;
    }

    /**
    * 引き渡す
    */
    public void release() {
        to.enqueue( item );

        panel.remove( cargo );
        panel.repaint();
    }

    /**
    * 受け取る
    */
    public void accept() throws Exception {

        System.out.printf( "%s: %3d/%3d\n", to.getClass().getName() , to.getCurrentQueueSize(), to.getLimit() );
        System.out.printf( "%s: %3d/%3d\n", from.getClass().getName() , from.getCurrentQueueSize(), from.getLimit() );

        if ( to.getCurrentQueueSize() >= to.getLimit() ) {
            /** DO NOTHING */
            return ;
        }

        this.item = from.dequeue();

        if ( item != null ) {

            // 積荷の初期位置を決定する
            cargo = new JPanel();
            if ( from instanceof Producer ) {
                cargo.setBounds( from.getX(), from.getY(), item.getSize(), item.getSize() );
            }
            if ( from instanceof StockPoint ) {
                cargo.setBounds( from.getX() + from.getWidth(), from.getY(), item.getSize(), item.getSize() );
            }
            cargo.setBackground( Color.red );
            panel.add( cargo );

            // スレッド生成・開始
            Thread thread = new Thread( this );
            thread.start();

        }
    }

    /** 移動する */
    public void run() {

        // 移動する際にItemの位置を描画
        int i = 0;
        int x = cargo.getX();
        int y = cargo.getY();
        while ( !reached() ) {
            paintItem();

            cargo.setLocation( x + i, y );

            try {
                Thread.sleep( 75 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }

            i += 10;

        }

        release();
    }

    private boolean reached() {
        return cargo.getX() >= to.getX();
    }

    private void paintItem() {
        panel.repaint();
    }
}
::::::::::::::
Item.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Item {
    protected int size = 10;
    protected Color color = null;

    protected int getSize() {
        return size;
    }

    protected void setColor( Color color ) {
        this.color = color;
    }

    protected Color getColor() {
        return color;
    }
}
::::::::::::::
MyPanel.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class MyPanel extends JPanel {

    private StockPoint sp;
    private Producer producer;
    private Consumer consumer;

    public MyPanel() {
        super();
        setBackground( new Color( 0xcc, 0xcc, 0xcc ) );

        setLayout( null );

        // StockPoint
        sp = new StockPoint( 20 );
        sp.setBounds( 260, 100, 200, 20 );
        sp.setThreshold( 15 );

        //  Producer
        producer = new Producer( 20 );
        producer.setBounds( 50, 100, 20, 200 );

        for ( int i = 0;i < 5;i++ ) {
            producer.produce();
        }

        // Consumer
        consumer = new Consumer( 15 );
        consumer.setBounds( 650, 100, 20, 200 );
        sp.setThreshold( 10 );

        this.add( sp );
        this.add( producer );
        this.add( consumer );

        Broker broker = new Broker( this, producer, sp, consumer );

    }

}
::::::::::::::
MyQueue.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class MyQueue extends JPanel {

    protected ArrayBlockingQueue<Item> queue = null;
    protected int limit;
    protected int threshold = 5; // デフォルト値

    public MyQueue( int limit ) {
        queue = new ArrayBlockingQueue( limit );
        this.limit = limit;
    }

    protected void setThreshold( int threshold ) {
        this.threshold = threshold;
    }

    protected int getLimit() {
        return limit;
    }

    protected int getCurrentQueueSize() {
        return queue.size();
    }

    protected void enqueue( Item item ) {
        boolean status = queue.offer( item );
        if ( !status ) {
            System.out.println( "queue is full in " + this.getClass().getName() );
        }

        repaint();
    }

    protected Item dequeue() throws Exception {
        if ( queue.size() > 0 ) {
            Item item = queue.take();
            repaint();

            return item;
        } else {
            return null;
        }
    }

    public void paintComponent( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;

        g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON );

        g2.setColor( Color.blue );
        g2.fillRect( 0, 0, getWidth(), getHeight() );

        g2.setColor( Color.white );
        int xPos = 0;
        Iterator iterator = queue.iterator();
        while ( iterator.hasNext() ) {
            Item item = ( Item ) iterator.next();

            int size = item.getSize();
            g2.fillOval( xPos, 0, size, size );

            xPos += size;
        }
    }

    /**
    * 発注点のチェック: 在庫数が閾値を下回っていたら仕入先に供給を促す
    */
    protected boolean isUnderThreshold() {
        return threshold > getCurrentQueueSize();
    }

}
::::::::::::::
P2C.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class P2C extends JFrame {

    public P2C() {
        super( "Producer To Consumer" );

        setBounds( 0, 0, 720, 540 );

        setLayout( new FlowLayout() );

        try {
            // 外観を設定します
            UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );
            // 外観を変更します
            SwingUtilities.updateComponentTreeUI( this );
        } catch ( Exception e ) {
            e.printStackTrace();
            System.exit( -1 );
        }

        setBackground( Color.black );

        MyPanel panel = new MyPanel();
        panel.setPreferredSize( new Dimension( getWidth(), getHeight() ) );

        Container container = getContentPane();
        container.add( panel );

        setVisible( true );

        addWindowListener( new WindowAdapter() {
                               public void windowClosing( WindowEvent event ) {
                                   dispose();
                                   System.exit( 0 );
                               }
                           }
                         );

    }

    public static void main( String[] args ) {

        new P2C();
    }

}

::::::::::::::
Producer.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Producer extends MyQueue implements Runnable {

    public Producer( int queueSize ) {
        super( queueSize );

        new Thread( this ).start();
    }

    /** 生産する */
    public void produce() {
        if ( getCurrentQueueSize() < getLimit() ) {

            long currentTime = System.currentTimeMillis();
            Item item = null;
            if ( currentTime % 3 == 0 ) {
                item = new BlackItem();
            } else {
                item = new WhiteItem();
            }

            enqueue( item );
        }
    }

    public void paintComponent( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;

        g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON );

        g2.setColor( Color.cyan );
        g2.fillRect( 0, 0, getWidth(), getHeight() );

        int yPos = 0;
        Iterator iterator = queue.iterator();
        while ( iterator.hasNext() ) {
            Item item = ( Item ) iterator.next();

            g2.setColor( item.getColor() );
            int size = item.getSize();
            g2.fillOval( 0, yPos, size, size );

            yPos += size;
        }
    }

    public void run() {
        while ( true ) {
            produce();
            try {
                Thread.sleep( 500 );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

}
::::::::::::::
StockPoint.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class StockPoint extends MyQueue {

    public StockPoint( int queueSize ) {
        super( queueSize );
    }

    public void paintComponent( Graphics g ) {
        Graphics2D g2 = ( Graphics2D ) g;

        g2.setRenderingHint( RenderingHints.KEY_ANTIALIASING,
                             RenderingHints.VALUE_ANTIALIAS_ON );

        g2.setColor( Color.blue );
        g2.fillRect( 0, 0, getWidth(), getHeight() );

        int xPos = getWidth();
        Iterator iterator = queue.iterator();
        while ( iterator.hasNext() ) {
            Item item = ( Item ) iterator.next();

            int size = item.getSize();
            g2.setColor( item.getColor() );
            g2.fillOval( xPos - size, 0, size, size );

            xPos -= size;
        }
    }

}
::::::::::::::
WhiteItem.java
::::::::::::::
import java.awt.*;
import java.awt.event.*;
import java.awt.dnd.*;
import java.awt.geom.*;
import java.awt.image.*;

import javax.imageio.*;

import javax.swing.event.*;
import javax.swing.*;
import javax.swing.border.*;

import java.io.*;
import java.util.*;
import java.util.concurrent.*;

/**
* $Id: AnotherP2C.html,v 1.1 2009/06/22 16:11:39 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class WhiteItem extends Item {

    public WhiteItem() {
        setColor( Color.white );
    }

}

戻る inserted by FC2 system