• java线程两种创建方式的区别与模拟买票情景


    在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

    • 避免点继承的局限,一个类可以继承多个接口。
    • 适合于资源的共享

    模拟卖火车站情况说明资源共享问题

    法一:继承Thread

    //模拟3个窗口卖火车票,通过继承Thread实现
    class MyThread extends Thread
    {
        private int ticket=5;//模拟3个窗口卖火车票
        private String name;
        public MyThread(String name)
        {
            this.name=name;
        }
        public void run() {
        
            while(ticket>0)
            {
                ticket--;
              System.out.println(name+"卖出了1个票,还剩下"+ticket+"张票");
            }    
        }
    }
    public class ThreadTicket {    
        public static void main(String[] args) {
            MyThread thread1=new MyThread("窗口A");
            MyThread thread2=new MyThread("窗口B");
            MyThread thread3=new MyThread("窗口C");
            
            //启动3个线程,3个线程模拟3个卖票窗口
            thread1.start();
            thread2.start();
            thread3.start();
    
        }
    
    }

    运行结果分析,实际是每个线程有自己的ticket为5,有自己的name,不是共享资源ticket=5

    窗口C卖出了1个票,还剩下4张票
    窗口C卖出了1个票,还剩下3张票
    窗口A卖出了1个票,还剩下4张票
    窗口A卖出了1个票,还剩下3张票
    窗口A卖出了1个票,还剩下2张票
    窗口A卖出了1个票,还剩下1张票
    窗口A卖出了1个票,还剩下0张票
    窗口C卖出了1个票,还剩下2张票
    窗口C卖出了1个票,还剩下1张票
    窗口C卖出了1个票,还剩下0张票
    窗口B卖出了1个票,还剩下4张票
    窗口B卖出了1个票,还剩下3张票
    窗口B卖出了1个票,还剩下2张票
    窗口B卖出了1个票,还剩下1张票
    窗口B卖出了1个票,还剩下0张票

    法二:继承Runnable接口

    class MyThread1 implements Runnable
    {
        private int ticket=5;//模拟3个窗口卖火车票
        public void run() {    
            while(ticket>0)
            {
                ticket--;
              System.out.println(Thread.currentThread().getName()+"卖出了1个票,还剩下"+ticket+"张票");
            }
            
        }
    }
    
    public class runnableTickect {
    
        public static void main(String[] args) {
            //使用Runnable定义的子类中没有start()方法,只有Thread类中才有
            MyThread1 thread=new MyThread1();
            //继承接口实现资源共享,是同一个变量ticket
            Thread th1=new Thread(thread, "window A");
            Thread th2=new Thread(thread, "window B");
            Thread th3=new Thread(thread, "window C");
            
            //启动线程
            th1.start();
            th2.start();
            th3.start();
        }
    
    }

    运行结果与分析,是同共享同一变量ticket=5,由于cpu抢占时间片有差异,可能结果多种多样

    window B卖出了1个票,还剩下3张票
    window C卖出了1个票,还剩下2张票
    window A卖出了1个票,还剩下3张票
    window C卖出了1个票,还剩下0张票
    window B卖出了1个票,还剩下1张票
  • 相关阅读:
    centos 安装Phpstorm
    PostgreSQL 里面的 BIGSERIAL
    如何下载symfony
    换行
    javaScript 真经 小感 this 指向
    css3 抖动
    jq 抖动效果
    还是 js 替代 vw vh 了
    常用 Math 属性及方法
    js 判断浏览器类型及版本
  • 原文地址:https://www.cnblogs.com/linhong/p/4269289.html
Copyright © 2020-2023  润新知