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)