练习题目:写三个线程,一起买100张票!(学习哔站韩顺平老师的讲解线程视频)
售票超卖问题引出的一个线程问题:
在实现售票超卖的时候,我分别用了实现Runnable
接口,和继承Thread
类,代码如下:
public class SellTicket_01 {
public static void main(String[] args) {
// SellTicket_03 sellTicket_03 = new SellTicket_03();
// new Thread(sellTicket_03).start();
// new Thread(sellTicket_03).start();
// new Thread(sellTicket_03).start();
new SellTicket_00().start();
new SellTicket_00().start();
new SellTicket_00().start();
}
}
class SellTicket_03 implements Runnable{
private int ticketNum = 10;
private boolean temp = true;
public synchronized void sell(){
if (ticketNum <= 0){
System.out.println("售票结束……");
temp = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口" + Thread.currentThread().getName()
+ "售出一张票"
+ "剩余票数:" + (--ticketNum));
}
@Override
public void run() {
while (temp){
sell();
}
}
}
class SellTicket_00 extends Thread{
private static int ticketNum = 10;
private boolean temp = true;
public synchronized void sell(){
if (ticketNum <= 0){
System.out.println("售票结束……");
temp = false;
return;
}
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("窗口" + Thread.currentThread().getName()
+ "售出一张票"
+ "剩余票数:" + (--ticketNum));
}
@Override
public void run() {
while (temp){
sell();
}
}
}
问题:继承Thread
类后,三个线程买的票都是十张,各买各的,相互不影响
问题的原因如下:
继承Thread
类不能实现线程变量资源共享(例如:A
类实现了Thread
类,A
类中的变量不能共享。因为每次new A()
都是创建了一个新的线程,每个A
类中都有那个变量)
实现Runnable
接口,线程变量是可以共享的,但是也可以不共享,主要看线程的创建方式
SellTicket_03 sellTicket_03 = new SellTicket_03();
new Thread(sellTicket_03).start();
new Thread(sellTicket_03).start();
new Thread(sellTicket_03).start();
new Thread(new SellTicket_03()).start();
new Thread(new SellTicket_03()).start();
new Thread(new SellTicket_03()).start();
仔细看,其实很容易发现,主要原因是new
的原因,每次new
都会创建新的对象,包括对象内面的一切变量方法等,因为他们已经是两个完全不一样的对象了(不一样的对象,怎么可以共享变量呢?就像生活中的我们怎么能让别人替我们吃饭呢?)
新手上路,望各路大神多多指教【拱手】【拱手】【拱手】