zoukankan      html  css  js  c++  java
  • 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张票
  • 相关阅读:
    关于git远程被覆盖的问题
    java.lang.UnsupportedClassVersionError:JDK版本不一致报错
    Git学习-上传项目到github
    Servlet+jsp用户登录加上验证码
    Ajax校验--最近更新
    数据校验
    文件上传--多文件上传
    文件上传
    类型转换
    Struts 2 --ONGL介绍
  • 原文地址:https://www.cnblogs.com/linhong/p/4269289.html
Copyright © 2011-2022 走看看