生産者とブローカーと消費者のシミュレーション
戻る
コマンドラインから、下記のように入力します。
$ 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 );
}
}
戻る