第一种创建线程方式
class SellWindow extends Thread
{
private String window;//窗口号,即线程编号
private static int count = 100;//假设有100张票,必须设置成静态,否则每个线程都拥有100张票
SellWindow(String window)
{
super(window);
}
public void run()
{
sell();
}
void sell()
{
while (count > 0)
{
System.out.println(type + Thread.currentThread().getName()
+ " 号窗口卖出\"" + this.type + (100 - count) + "\"号票 剩余:"
+ --count);
}
}
}
class SellTicket
{
public static void main(String[] args)
{
//创建四个线程并分别启动
SellWindow sw1 = new SellWindow("001");
SellWindow sw2 = new SellWindow("002");
SellWindow sw3 = new SellWindow("003");
SellWindow sw4 = new SellWindow("004");
sw1.start();
sw2.start();
sw3.start();
sw4.start();
}
}
方式二:此法更可取
- 这样把线程任务封装在run()中,单独用Threadc创建四个进程,但是每次传入的参数都是SellWindow对象的,
这样保证票数count属于一个任务对象,不会造成独立使用count现象
当票种多样时,方法一就不行了
class SellWindow implements Runnable
{
private String type = "不限";
private int count = 100;
SellWindow()
{
}
SellWindow(String type)
{
this.type = type;
}
public void run()
{
sell();
}
void sell()
{
while (count > 0)
{
System.out.println(type + Thread.currentThread().getName()
+ " 号窗口卖出\"" + this.type + (100 - count) + "\"号票 剩余:"
+ --count);
}
}
}
class SellTicket
{
public static void main(String[] args)
{
// 创建一个线程任务对象
/*
* SellWindow sw1 = new SellWindow( ); Thread t1 = new Thread(sw1);
* Thread t2 = new Thread(sw1); Thread t3 = new Thread(sw1); Thread t4 =
* new Thread(sw1); t1.start(); t2.start(); t3.start(); t4.start();
*/
// 创建两个线程任务,一个卖高铁票,一个动车票
SellWindow swG = new SellWindow("高铁票");
SellWindow swD = new SellWindow("动车票");
// 创建四个线程,分别分种类传入
Thread tg1 = new Thread(swG, "001");
Thread tg2 = new Thread(swG, "002");
Thread td1 = new Thread(swD, "003");
Thread td2 = new Thread(swD, "004");
tg1.start();
tg2.start();
td1.start();
td2.start();
}
}
结果:
高铁票001 号窗口卖出”高铁票0”号票 剩余:99
动车票004 号窗口卖出”动车票1”号票 剩余:98
高铁票002 号窗口卖出”高铁票1”号票 剩余:98
动车票003 号窗口卖出”动车票0”号票 剩余:99
高铁票002 号窗口卖出”高铁票3”号票 剩余:96
动车票004 号窗口卖出”动车票2”号票 剩余:97
高铁票001 号窗口卖出”高铁票2”号票 剩余:97
高铁票001 号窗口卖出”高铁票5”号票 剩余:94
……
(打印不是按照顺序是因为还有其他线程在占用CPU)