JAVA线程中的发牌题

发牌题主要考虑的就是线程的问题,一个buffer缓冲区的问题,

首先,发牌的优先级当然是最高的了,但是取牌不能有优先级,否则会一直有牌先取,因此需要一个信号量order,当order=线程的数字时,取get

否则等待,

因此这个只能是线程的基础题吧,我也是刚刚把例题的基本含义搞懂,写下来记录一下

package fapai;

public class CardBuffer<T> {
    private T obj;
    private boolean isEmpty=true;
    private int number;
    private int order=0;
    public CardBuffer(int number)
    {
        this.number=number;
    }
    public synchronized void put(T obj)
    {
        while(!isEmpty)
        {
            try
            {
                this.wait();
            }
            catch(InterruptedException ex){}
        }
        this.obj=obj; 
        this.isEmpty=false;
        this.notifyAll();
    }
    public synchronized T get(int order)
    {
        while(this.isEmpty||this.order!=order)
        {
            try
            {
                this.wait();
            }
            catch(InterruptedException ex){}
            
        }
        this.isEmpty=true;
        this.order=(this.order+1)%this.number;
        this.notifyAll();
        return this.obj;
        
    }
}
    

package fapai;

public class CardSendThread extends Thread{
    private CardBuffer<Integer> buffer;
    private int cardMax,number;
    public CardSendThread(CardBuffer<Integer> buffer,int cardMax,int number)
    {
        this.buffer=buffer;
        this.cardMax=cardMax;
        this.number=number;
        this.setPriority(Thread.MAX_PRIORITY);
    }
    public void run()
    {
        for(int i=1;i<=this.cardMax;i++)
            this.buffer.put(i);
        for(int i=1;i<=this.number;i++)
            this.buffer.put(null);
    }

}

package fapai;
import java.awt.*;
import javax.swing.*;
public class CardReceiveJFrame extends JFrame implements Runnable {
    private CardBuffer<Integer> buffer;
    private JTextArea text;
    private int order;
    public CardReceiveJFrame(CardBuffer<Integer>buffer,int order,String title,int x,int y)
    {
        super(title);
        this.setBounds(x,y,290,100);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.buffer=buffer;
        this.order=order;
        this.text=new JTextArea();
        this.getContentPane().add(this.text);
        this.text.setLineWrap(true);
        this.text.setEditable(false);
        this.text.setFont(new Font("Arial",Font.PLAIN,20));
        this.setVisible(true);
        new Thread(this).start();
        
    }
    public void run()
    {
        while(true)
        {
            Integer value=this.buffer.get(this.order);
            if(value==null)
                return ;
            this.text.append(String.format("%4d",value));
            try
            {
                Thread.sleep(100);
            }
            catch(InterruptedException ex){}
        }
    }

}

package fapai;

public class Deal {
    public Deal(int cardMax,int number)
    {
        CardBuffer<Integer> buffer=new CardBuffer<Integer>(number);
        new CardSendThread(buffer,cardMax,number).start();
        String titles[]={"北","东","南","西"};
        int x[]={400,700,400,100},y[]={200,320,440,320};
        for(int i=0;i<number;i++)
            new CardReceiveJFrame(buffer,i,titles[i],x[i],y[i]);
    }
    public static void main(String arg[])
    {
        new Deal(52,4);
    }

}

猜你喜欢

转载自www.cnblogs.com/chenxiansen/p/11973014.html