📄 example09_synchronized_ticketjtable.java
字号:
package example.ch09;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.border.*;
public class Example09_Synchronized_TicketJTable extends JFrame implements ActionListener
{
JTextField saleinit;
JTextField salecur;
JButton start;
JButton buyer;
JScrollPane scroll;
DefaultTableModel model;
JLabel status;
int[] moneystyle={5,10,20,50,100};
int stylenum=moneystyle.length;
int moneynum;
int buyerid=0;
public Example09_Synchronized_TicketJTable()
{
setDefaultCloseOperation(EXIT_ON_CLOSE);
Font font=new Font("宋体",Font.BOLD,24);
Container con=getContentPane();
((BorderLayout)con.getLayout()).setVgap(10);
saleinit=new JTextField();
salecur=new JTextField();
salecur.setEditable(false);
start=new JButton("开始本次的售票");
buyer=new JButton("创建一个购票者");
buyer.setEnabled(false);
start.addActionListener(this);
buyer.addActionListener(this);
Box box1=Box.createHorizontalBox();
JLabel initl=new JLabel("售票员初始金额");
box1.add(Box.createHorizontalStrut(5));
box1.add(initl);
box1.add(Box.createHorizontalStrut(5));
box1.add(saleinit);
box1.add(Box.createHorizontalStrut(15));
box1.add(start);
box1.add(Box.createHorizontalStrut(5));
Box box2=Box.createHorizontalBox();
JLabel curl=new JLabel("售票员当前金额");
box2.add(Box.createHorizontalStrut(5));
box2.add(curl);
box2.add(Box.createHorizontalStrut(5));
box2.add(salecur);
box2.add(Box.createHorizontalStrut(15));
box2.add(buyer);
box2.add(Box.createHorizontalStrut(5));
Box box=Box.createVerticalBox();
box.add(Box.createVerticalStrut(10));
box.add(box1);
box.add(Box.createVerticalStrut(10));
box.add(box2);
box.add(Box.createVerticalStrut(10));
box.setBorder(new LineBorder(Color.blue,4));
initl.setFont(font);
curl.setFont(font);
saleinit.setFont(font);
salecur.setFont(font);
start.setFont(font);
buyer.setFont(font);
Object[][] rows={};
Object[] cols={"序号","线程标识","所持金额","剩余金额","交易状态"};
model=new DefaultTableModel(rows,cols);
JTable table=new JTable(model);
table.setRowHeight(26);
table.setFont(font);
status=new JLabel("当前状态:");
con.add(box,"North");
scroll=new JScrollPane(table);
con.add(scroll,"Center");
con.add(status,"South");
setVisible(true);
setExtendedState(MAXIMIZED_BOTH);
}
public void actionPerformed(ActionEvent evt)
{
if (evt.getSource()==start)
{
startSale();
}
if (evt.getSource()==buyer)
{
buyerid++;
TicketBuyer buyer=new TicketBuyer(this,buyerid);
Object[] row=
{
new Integer(buyerid),
buyer,
new Integer(buyer.getMoney()),
new Integer(buyer.getMoney()),
buyer.getStatus(),
};
model.addRow(row);
buyer.start();
status.setText("活动线程数="+Thread.activeCount());
}
}
public synchronized void sale(TicketBuyer buyer)
{
for (int i=0;i<stylenum;i++)
{
if (buyer.getMoney()==moneystyle[i])
{
while (buyer.getMoney()!=5 && moneynum<moneystyle[i]/5-1)
{
try
{
wait();
}
catch (InterruptedException e)
{
}
}
moneynum++;
salecur.setText(String.valueOf(moneynum*5));
buyer.setMoney(buyer.getMoney()-5);
buyer.setStatus("成功!!!");
model.setValueAt(new Integer(buyer.getMoney()),buyer.getID()-1,3);
model.setValueAt(buyer.getStatus(),buyer.getID()-1,4);
break;
}
}
notifyAll();
}
public void startSale()
{
try
{
moneynum=Integer.parseInt(saleinit.getText());
if (moneynum%5!=0)
{
saleinit.setText(null);
saleinit.requestFocus();
JOptionPane.showMessageDialog(this,"输入的初始金额要求是5的整倍数!");
}
else
{
moneynum/=5;
salecur.setText(saleinit.getText());
buyer.setEnabled(true);
start.setEnabled(false);
}
}
catch (NumberFormatException e)
{
JOptionPane.showMessageDialog(this,"输入的初始金额格式异常!");
saleinit.requestFocus();
}
}
public static void main(String[] args)
{
new Example09_Synchronized_TicketJTable();
}
}
class TicketBuyer extends Thread
{
int[] moneystyle={5,10,20,50,100};
int id;
int money;
String state;
Example09_Synchronized_TicketJTable frm;
public TicketBuyer(Example09_Synchronized_TicketJTable frm,int id)
{
this.frm=frm;
this.id=id;
money=moneystyle[(int)(Math.random()*moneystyle.length)];
state="等待中......";
}
public int getMoney()
{
return money;
}
public void setMoney(int money)
{
this.money=money;
}
public String getStatus()
{
return state;
}
public void setStatus(String state)
{
this.state=state;
}
public int getID()
{
return id;
}
public void run()
{
frm.sale(this);
}
} int getID()
{
return id;
}
public void run()
{
frm.sale(this);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -