• java 多线程之卖票两种方式


    1.通过extends Thread

     1 /*
     2  需求:简单的卖票,多个窗口同时买票
     3        (共用资源)
     4  创建线程的第二种方式:实现Runnable接口
     5 
     6  步骤:
     7  1,定义类实现Runnable接口
     8  2,覆盖/重写Runnable接口中的run方法
     9     将将线程要运行的代码存放在该run方法中
    10  3,通过Thread类建立线程对象
    11  4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
    12     为什么要将Runnable接口的子类对象传递给Thread的构造参数呢?
    13     答:自定义的run方法(自定义代码块存储在这里)是属于Runnable接口的子类对象
    14         所以要让线程去指定对象的run方法,就必须明确该run方法所属对象
    15  5,调用Thread类的start方法开启线程并调用Runnable接口的子类方法
    16 
    17  实现方式(implements)和继承(extends)方式的区别:
    18 
    19  实现方式的好处:避免了单继承的局限性
    20  在定义线程时,最好使用实现方式
    21 
    22  两种方式的区别:
    23  继承Thread:线程代码存放Thread子类run方法中
    24  实现Runnable:线程代码存放在接口子类的run方法中
    25 */
    26 class Ticket extends Thread
    27 {   
    28     Ticket(String name)
    29     {
    30         super(name);        //构造函数:设置线程名称
    31     }
    32     private int ticket =100;
    33     public void run()
    34     {
    35         while(true)
    36         {
    37             if(ticket>0)
    38             {
    39                 System.out.println(Thread.currentThread().getName()+"还有余票数:"+ticket--);
    40             }
    41         }
    42     }
    43 }
    44 class TicketDemo 
    45 {
    46     public static void main(String[] args) 
    47     {   
    48         Ticket t1 = new Ticket("票窗口1");
    49         Ticket t2 = new Ticket("票窗口2");
    50         Ticket t3 = new Ticket("票窗口3");
    51         Ticket t4 = new Ticket("票窗口4");
    52 
    53         t1.start();
    54         t2.start();
    55         t3.start();
    56         t4.start();
    57         System.out.println("Hello World!");
    58     }
    59 }

    2,通过implents Runnable:

    class Ticket implements Runnable  //extends Thread
    {   
        
        private int ticket =100;
        public void run()
        {
            while(ticket>0)
            {            
                    System.out.println(Thread.currentThread().getName()+"还有余票数:"+ticket--);        
            }
        }
    }
    class TicketDemo 
    {
        public static void main(String[] args) 
        {   
            Ticket t =new Ticket();
    
            Thread t1 = new Thread(t,"票窗口1");
            Thread t2 = new Thread(t,"票窗口2");
            Thread t3 = new Thread(t,"票窗口3");
            Thread t4 = new Thread(t,"票窗口4");
    
            t1.start();
            t2.start();
            t3.start();
            t4.start();
            System.out.println("Hello World!");
        }
    }

    注释说明:

    1,无需suprname,故删除。

    2,通过jdk手册可以看到Thread构造函数有该格式:

    Thread(Runnable target, String name)
              分配新的 Thread 对象。

    所有,可直接加对象名称


    错误方式:

    class TicketDemo 
    {
        public static void main(String[] args) 
        {   
            Ticket t =new Ticket();
    
            Thread t1 = new Thread(t,"票窗口1");
            
    
            t1.start();
            t1.start();
            t1.start();
            t1.start();
            
            System.out.println("Hello World!");
        }
    }

    该方法导致t1线程不同的从运行态切换回来,所以程序报错:

    Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Unknown Source)
    at TicketDemo.main(TicketDemo.java:48)

  • 相关阅读:
    基础算法:求目标值 &字符串反转
    算法计算出股票最佳交易时间点
    Python 设计模式—命令模式
    Python 设计模式—代理模式
    有趣的算法题~单调栈
    令人头大的字符串—算法处理
    WebUI 自动化测试的经典设计模式:PO
    双指针—滑动窗口算法解析
    Python 设计模式—观察者模式
    多线程之读写锁原理
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4946973.html
Copyright © 2020-2023  润新知