• 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张票
  • 相关阅读:
    ubuntu12.04 安装配置jdk1.7
    Ubuntu下解决bash 没有那个文件或目录的方法
    Mongodb集群搭建的三种方式
    AngularJS 中文资料+工具+库+Demo 大搜集
    Android 反编译apk 详解
    Node.js 开发模式(设计模式)
    Comet:基于 HTTP 长连接的“服务器推”技术
    基于NodeJS的全栈式开发
    node.js应用Redis数据库
    Hibernate(二):MySQL server version for the right syntax to use near 'type=InnoDB' at line x
  • 原文地址:https://www.cnblogs.com/linhong/p/4269289.html
Copyright © 2020-2023  润新知