1 package multithread.test;
2
3 /*
4 * 卖票
5 */
6
7
8 /*
9 * 线程安全问题产生的原因:
10 * 1,多个线程在操作共享的数据。
11 * 2,操作共享数据的线程代码有多条。
12 *
13 * 当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了运算。
14 * 就会导致线程安全问题的产生。
15 *
16 */
17 class Ticket implements Runnable {//extends Thread {
18 private /*static*/ int num = 100;//静态是可以的,根据实际看,有可能是这个线程负责这种100张,另一个线程时另一种票100张
19
20 public void run() /*throws 不处理就抛,但是实现接口覆盖的方法,接口没有声明过异常,只能catch不能声明*/{
21 while(true) {
22 if (num>0) {
23 try {
24 Thread.sleep(10);
25 } catch (InterruptedException e) {
26 // TODO: handle exception
27 }
28 // //
29 System.out.println(Thread.currentThread().getName()+"....sale...."+ num--);
30 }
31
32 }
33 }
34 }
35
36 public class TicketDemo {
37
38 public static void main(String[] args) {
39 // TODO Auto-generated method stub
40
41 Ticket t = new Ticket();//创建一个线程任务对象。
42
43
44 Thread t1 = new Thread(t);
45 Thread t2 = new Thread(t);
46 Thread t3 = new Thread(t);
47 Thread t4 = new Thread(t);
48
49 t1.start();
50 t2.start();
51 t3.start();
52 t4.start();
53 /*
54 Ticket t1 = new Ticket();
55 Ticket t2 = new Ticket();
56 Ticket t3 = new Ticket();
57 Ticket t4 = new Ticket();
58 //只有100张,卖了400张,为什么?
59 t1.start();
60 // t1.start();IllegalThreadStateException-无效线程状态异常是 runtime异常
61 // t1.start();
62 // t1.start();
63
64 t2.start();
65 t3.start();
66 t4.start();
67 */
68
69
70 }
71 //cmd 打印完1在前面 比如43打印在后面, cmd是应用程序,虚拟机也是一个应用程序,cpu也是在这两个中切换造成的
72 }