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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM