问题描述
- 售票窗口多线程问题,比较俩种代码
-
代码一:
public class TestThread {public static void main(String[] args) { // TODO Auto-generated method stub Test t=new Test(); Test t1=new Test(); Test t2=new Test(); t.start(); t1.start(); t2.start(); }
}
//class Test extends Thread
class Test extends Thread
{
private int num=50;
private Dog myDog=new Dog();
public void run()
{while(true) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (myDog) { if(num>0) { System.out.println(this.getName()+"正在售出第"+num+"张票"); num--; }else { break; } } } }
}
class Dog
{
}**代码二:** public class TestThread { public static void main(String[] args) { //定义一个售票窗口 TicketWindow tw1=new TicketWindow(); //使用三个线程同时启动 Thread t1=new Thread(tw1); Thread t2=new Thread(tw1); Thread t3=new Thread(tw1); t1.start(); t2.start(); t3.start(); }
}
//售票窗口类
class TicketWindow implements Runnable {
//共有2000张票
private int nums=2000;
private Dog myDog=new Dog();public void run() { while(true){ //出票速度是1秒出一张 try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } //认为if else要保证其原子性 //先判断是否还有票 synchronized(myDog){ if(nums>0){ //显示售票信息 //Thread.currentThread().getName()得到当前线程的名字 System.out.println(Thread.currentThread().getName()+"正在售出第"+nums+"张票"); nums--; }else{ //售票结束 break; } } } }
}
class Dog{
}俩种代码的区别是什么?求大神指点。运行结果完全不同。
解决方案
实现多线程有2中一种是继承Thread,一种是实现Runnable。一般情况下比较推荐实现Runnable接口。
因为java中一个类只能继承一个父类,所以受局限性。还有一个重要的是实现Runnable接口的线程资源可以共享。
根据上面购票系统解释一下的话一共的票数是固定的 只是用多线程并发的去卖票。
所以TicketWindow可以共享给多个线程购买。但是如果继承Thread的话首先得将2000个票分给每一个线程,每一个线程只能固定卖自己所有的,资源不被共享。
如果理解了麻烦请采纳,为了好理解我全是手写的~
解决方案二:
谢谢,今天看书看到了。俩种实现多线程的区别。票数存在共享与否的问题。所以代码1中,每张票卖了三次。
时间: 2024-09-19 09:04:16