⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 example09_synchronized_ticketjtable.java

📁 这是我第九章java原程序代码,是实现多线程功能的
💻 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 + -