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)

 

转载于:https://www.cnblogs.com/shuqingstudy/p/4946973.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值