想学习线程,于是弄个购票的小程序练练手,发现有些细节会想着一直去完善。
功能描述:
这个购票系统会自动在两秒后售出一张票,票的编号和座位号都是随机生成的。票面时间和价格固定。
线程有两种实现方法:
1.实现Runnable接口
(1)实现Runnable接口的实现类
public class TicketThread implements Runnable {
@Override
public void run() {
...(任务代码)
}
}
(2)启用实现类的步骤:
Runnable runnable = new TicketThread();//创建一个类对象
Thread t = new Thread(runnable);//创建线程
t.start();//启动线程
2.继承Thread类
class MyThread extends Thread{
public void run(){
...(任务代码)
}
}
《Java核心技术卷I》中提示,不要调用Thread类或者Runnable对象的run方法。因为直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程。
Runnable runnable = new TicketThread();//创建一个类对象
Thread t = new Thread(runnable);//创建线程
t.run();//不启动新线程
Ticket类
package com.kiki.thread;
import java.util.Date;
public class Ticket {
private int id;
private int ticket_number;
private String ticket_time;
private Date buy_time;
private String seat;
private double price;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTicket_time() {
return ticket_time;
}
public void setTicket_time(String ticket_time) {
this.ticket_time = ticket_time;
}
public Date getBuy_time() {
return buy_time;
}
public void setBuy_time(Date buy_time) {
this.buy_time = buy_time;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getTicket_number() {
return ticket_number;
}
public void setTicket_number(int ticket_number) {
this.ticket_number = ticket_number;
}
public Ticket(){
}
/*
* 随机生成座位号(A-Z,1-50)
*/
public String seatUtil(){
String seat;
String line ;
int number;
/*
* 产生列A-Z
*/
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
line = String.valueOf(chars.charAt((int) (Math.random()*26)));
/*
* 产生座位号1-50
*/
number =(int)(Math.random()*50);
seat = line+","+String.valueOf(number);
return seat;
}
public Ticket(int id, int ticket_number, String seat) {
super();
this.id = id;
this.ticket_number = ticket_number;
this.seat = seat;
this.ticket_time = "2017-08-10";
this.price = 30.5;
this.buy_time = new Date();
}
@Override
public String toString() {
return "Ticket [id=" + id + ", ticket_number=" + ticket_number + ", ticket_time=" + ticket_time + ", buy_time="
+ buy_time + ", seat=" + seat + ", price=" + price + "]";
}
}
线程实现类TicketThread
package com.kiki.thread;
public class TicketThread implements Runnable {
@Override
public void run() {
try {
for(int i=1;i<21;i++){
Ticket ticket = new Ticket();
Ticket t = new Ticket(i, (int)(Math.random()*900)+100,ticket.seatUtil());
System.out.println(t.toString());
Thread.sleep(2000);//休眠2秒(2000ms)
}
} catch (InterruptedException e) {
System.out.println("线程休眠异常!");
}
}
}
测试类
package com.kiki.thread;
public class TicketThreadTest {
public static void main(String[] args) {
Runnable runnable = new TicketThread();
Thread t = new Thread(runnable);
t.start();
}
}
运行结果:
Ticket [id=1, ticket_number=331, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:05 CST 2017, seat=I,15, price=30.5]
Ticket [id=2, ticket_number=516, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:07 CST 2017, seat=U,8, price=30.5]
Ticket [id=3, ticket_number=501, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:09 CST 2017, seat=B,16, price=30.5]
Ticket [id=4, ticket_number=706, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:11 CST 2017, seat=L,46, price=30.5]
Ticket [id=5, ticket_number=454, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:13 CST 2017, seat=O,46, price=30.5]
Ticket [id=6, ticket_number=106, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:15 CST 2017, seat=H,21, price=30.5]
Ticket [id=7, ticket_number=497, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:17 CST 2017, seat=E,18, price=30.5]
Ticket [id=8, ticket_number=154, ticket_time=2017-08-10, buy_time=Thu Aug 10 06:09:19 CST 2017, seat=D,32, price=30.5]
...(节选了前几个输出)