温柔狠角色 2016-04-12 07:02 采纳率: 57.1%
浏览 1440
已采纳

售票窗口多线程问题,比较俩种代码

代码一:
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条回答

  • xiaoyao880609 2016-04-12 08:07
    关注

    实现多线程有2中一种是继承Thread,一种是实现Runnable。一般情况下比较推荐实现Runnable接口。
    因为java中一个类只能继承一个父类,所以受局限性。还有一个重要的是实现Runnable接口的线程资源可以共享。
    根据上面购票系统解释一下的话一共的票数是固定的 只是用多线程并发的去卖票。
    所以TicketWindow可以共享给多个线程购买。但是如果继承Thread的话首先得将2000个票分给每一个线程,每一个线程只能固定卖自己所有的,资源不被共享。
    如果理解了麻烦请采纳,为了好理解我全是手写的~

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况