import javax.swing.JFrame; import java.awt.Container; import java.awt.FlowLayout; import javax.swing.JLabel; import javax.swing.ImageIcon; import javax.swing.UIManager; //搬运工板砖 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"); } }