//搬运工板砖
class Bricks extends JFrame
{
boolean canMoveN[];
boolean canMoveP[];
JLabel jb[]; //砖的标签
JLabel jw[]; //搬运工的标签
ImageIcon image; //有砖的图片
ImageIcon black; //没有砖的图片
ImageIcon worker; //搬运工的图片
public Bricks()
{
super("搬砖");
canMoveN=new boolean[4];
canMoveP=new boolean[4];
for(int i=0; i<4; i++)
{
//初始化,不用等待下一个人
canMoveN[i]=true;
}
//这里采用的格式是为了打包图片
image=new ImageIcon("res/bricks.gif");
black=new ImageIcon("res/null.gif");
worker=new ImageIcon("res/worker.gif");
Container c=getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT));
jb=new JLabel[10];
jw=new JLabel[5];
for(int i=0; i<10; i++)
{
//添加是否有砖的标签
JLabel j=new JLabel();
jb[i]=j;
jb[i].setIcon(black);
c.add(jb[i]);
//添加搬运工标签
if(i%2==0)
{
JLabel w=new JLabel();
jw[i/2]=w;
jw[i/2].setIcon(worker);
c.add(jw[i/2]);
}
}
}
}
//搬运工搬砖线程
class Workers extends JFrame implements Runnable
{
private int m_ID;
private boolean left,right;
private Bricks m_canMove;
public Workers(int m_ID, Bricks m_canMove)
{
this.m_ID=m_ID;
this.m_canMove=m_canMove;
}
//等待前一个
public synchronized void waitPrev()
{
try
{
if(m_ID>0)
{
while(!m_canMove.canMoveP[m_ID-1])
{
//System.out.println(m_ID+"等待"+(m_ID-1));
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
//等待后一个人
public synchronized void waitNext()
{
try
{
if(m_ID<4)
{
while(!m_canMove.canMoveN[m_ID])
{
//System.out.println(m_ID+"等待"+(m_ID+1));
}
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()
{
while(true)
{
//从前一个人手中或地上接过一块砖
//从前一个人的右手中接过一块砖
waitPrev();
if(!left)
{
try
{
Thread.sleep((int)(Math.random()*1000));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
m_canMove.jb[2*m_ID].setIcon(m_canMove.image);
System.out.println(m_ID+"左手接到砖");
left=true;
}
//左手占据
if(m_ID>0)
{
m_canMove.canMoveN[m_ID-1]=false;
}
//右手占据
if(m_ID<4)
{
m_canMove.canMoveP[m_ID]=false;
}
//左手传到右手
if(!right&&left)
{
try
{
Thread.sleep((int)(Math.random()*1000));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
m_canMove.jb[2*m_ID].setIcon(m_canMove.black);
m_canMove.jb[2*m_ID+1].setIcon(m_canMove.image);
System.out.println(m_ID+"左手到右手");
//右手被占据
right=true;
//左手被释放
left=false;
}
//左手空闲
if(m_ID>0)
{
m_canMove.canMoveN[m_ID-1]=true;
}
waitNext();
//右手传给下一个人
try
{
Thread.sleep((int)(Math.random()*1000));
}
catch(InterruptedException e)
{
e.printStackTrace();
}
if(m_ID<4)
{
System.out.println(m_ID+"传给"+(m_ID+1));
m_canMove.jb[2*m_ID+1].setIcon(m_canMove.black);
m_canMove.jb[2*m_ID+2].setIcon(m_canMove.image);
}
//右手释放砖
else
{
System.out.println(m_ID+"右手释放砖");
m_canMove.jb[2*m_ID+1].setIcon(m_canMove.black);
}
right=false;
//右手空闲
if(m_ID<4)
{
m_canMove.canMoveP[m_ID]=true;
}
}
}
}
public class Rxd_11_6
{
public static void main(String args[])
{
Bricks bricks=new Bricks();
bricks.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
bricks.setSize(800,150);
for(int i=0; i<5; i++)
{
//启动每个线程
new Thread(new Workers(i,bricks)).start();
}
bricks.setVisible(true);
try
{
//设置为windows风格
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println("main end");
}
}