使用第二种方式创建线程,原因是执行线程目标对象共享
为了体现效果,我们使用sleep()方法进行线程睡眠
public static void sleep(long millis)throws InterruptException(可打断异常)
当某一个线程调用了sleep方法之后,就会被睡眠(时间自己定 - 毫秒值),睡眠醒了之后会立即被分配到可运行状态,等待CPU调用
安全问题分析:
- 共享数据
- 操作共享数据
一次完整的操作过程,应该是不可分割的执行的,即完整的操作中,不应该被其他的线程抢夺CPU ```java package Test22_Demo.Demo03;/*
@create 2020—12—15—10:32 */
public class Ticket implements Runnable {
private int number = 100;
@Override
public void run() {
while (true) {
//线程暂停两秒
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//如果有票就卖
if (number > 0) {
String threadName = Thread.currentThread().getName();
System.out.println(threadName + "正在销售第"+(number--) + "张票");
} else {
//没票了
break;
}
}
}
}
```java
package Test22_Demo.Demo03;/*
@create 2020--12--15--10:44
*/
/**
* 测试线程
*/
public class ThreadDemo {
public static void main(String[] args) {
//实例化目标
Ticket ticket = new Ticket();
//使用该买票的目标创建多个程序
Thread thread1 = new Thread(ticket, "Jack");
Thread thread2 = new Thread(ticket, "Rose");
Thread thread3 = new Thread(ticket, "Tom");
//启动多个线程
thread1.start();
thread2.start();
thread3.start();
}
}