1.Thread方法实现
package SellTicket.thread;
public class SellTicketThread extends Thread {
/*
* 1。这里要设置成static,否则就是每个窗口都有100张
* */
private static int ticketNumber = 100;
@Override
public void run() {
/*
* 2。while(true)是为了循环买票
* */
while (true) {
if (ticketNumber == 0)
break;
if (ticketNumber > 0) {
System.out.println(Thread.currentThread().getName() + "卖出一张,还剩:" + (--ticketNumber));
/*
* 3.线程休眠100ms
* (1).为了模拟买票的实际情况
* (2).不加会出现买票顺序混乱,但是任然是会卖出100张。
* */
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package SellTicket.thread;
public class StartSell {
public static void main(String[] args) {
// TODO Auto-generated method stub
SellTicketThread s1 = new SellTicketThread();
SellTicketThread s2 = new SellTicketThread();
SellTicketThread s3 = new SellTicketThread();
s1.start();
s2.start();
s3.start();
// new SellTicketThread().start();匿名内部类实现
// new SellTicketThread().start();
// new SellTicketThread().start();
// new SellTicketThread().start();
}
}
2.实现Runnable接口
package SellTicket.runnable;
public class SellTicketThread implements Runnable {
/*
* 1。这里要设置不用设置成static,因为我们只new了一个sellTicketThread对象,
* 不管有多少线程运行,都只是一个对象,为了实现匿名内部类方式,所以加上了static
* */
private static int ticketNumber = 100;
@Override
public void run() {
/*
* 2。while(true)是为了循环买票
* */
while (true) {
if (ticketNumber == 0)
break;
if (ticketNumber > 0) {
System.out.println(Thread.currentThread().getName() + "卖出一张,还剩:" + (--ticketNumber));
/*
* 3.线程也可以不用休眠100ms(为了实现匿名内部类)
* (1).为了模拟买票的实际情况,当然可以用。
* (2).因为操作的是一个对象,所以程序不会出现混乱的情况
* */
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
package SellTicket.runnable;
public class StartSell {
public static void main(String[] args) {
// TODO Auto-generated method stub
//方法一
//只用了一个对象,用了三个线程操作这一个对象
SellTicketThread sellTicketThread = new SellTicketThread();
Thread t1 = new Thread(sellTicketThread);
Thread t2 = new Thread(sellTicketThread);
Thread t3 = new Thread(sellTicketThread);
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
//方法二
// SellTicketThread sellTicketThread = new SellTicketThread();
// Thread t1 = new Thread(sellTicketThread,"窗口一");
// Thread t2 = new Thread(sellTicketThread,"窗口二");
// Thread t3 = new Thread(sellTicketThread,"窗口三");
// t1.start();
// t2.start();
// t3.start();//方法三
//匿名内部类
// SellTicketThread sellTicketThread = new SellTicketThread();
// new Thread(sellTicketThread,"窗口一").start();
// new Thread(sellTicketThread,"窗口二").start();
// new Thread(sellTicketThread,"窗口三").start();
//方法四
//匿名内部类
new Thread(new SellTicketThread(),"窗口一").start();
new Thread(new SellTicketThread(),"窗口二").start();
new Thread(new SellTicketThread(),"窗口三").start();
}
}
相比较而言,Runnable接口比Thread类,好很多!!