Producer to Consumer

戻る



::::::::::::::
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: P2C.html,v 1.1 2009/06/22 16:11:51 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() );

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

            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: P2C.html,v 1.1 2009/06/22 16:11:51 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 ) {
            Thread thread = new Thread( this );
            thread.start();

            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 );
        }
    }

    /** 移動する */
    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: P2C.html,v 1.1 2009/06/22 16:11:51 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class Item {
    protected int size = 10;


    public int getSize() {
        return size;
    }

}
::::::::::::::
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: P2C.html,v 1.1 2009/06/22 16:11:51 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class MyPanel extends JPanel implements ActionListener {

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

    public MyPanel() {
        super();
        setBackground( Color.black );

        setLayout( null );

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

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

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

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

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

        JButton button1 = new JButton( "PtoS" );
        button1.setBounds( 260, 450, 100, 30 );
        button1.addActionListener( this );
        button1.setActionCommand( "PtoS" );
        this.add( button1 );

        JButton button2 = new JButton( "StoC" );
        button2.setBounds( 400, 450, 100, 30 );
        button2.addActionListener( this );
        button2.setActionCommand( "StoC" );
        this.add( button2 );
    }

    public void actionPerformed( ActionEvent event ) {

        String command = event.getActionCommand();

        if ( "PtoS".equals( command ) ) {
            // 本来はProducerクラス内の処理
            Deliverer deliverer = new Deliverer( this );
            deliverer.setFrom( producer );
            deliverer.setTo( sp );

            try {
                deliverer.accept();
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
        if ( "StoC".equals( command ) ) {
            Deliverer deliverer = new Deliverer( this );
            deliverer.setFrom( sp );
            deliverer.setTo( consumer );

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

    }

}
::::::::::::::
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: P2C.html,v 1.1 2009/06/22 16:11:51 kishi Exp kishi $
* @author KISHI Yasuhiro
*/

public class MyQueue extends JPanel {

    protected ArrayBlockingQueue<Item> queue = null;
    protected int limit;

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

    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;
        }
    }
}
::::::::::::::
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: P2C.html,v 1.1 2009/06/22 16:11:51 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: P2C.html,v 1.1 2009/06/22 16:11:51 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() ) {
            Item item = new Item();
            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() );

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

            int size = item.getSize();
            g2.fillOval( 0, yPos - size, 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: P2C.html,v 1.1 2009/06/22 16:11:51 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() );

        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;
        }
    }
}


戻る inserted by FC2 system