使用第二种方式创建线程,原因是执行线程目标对象共享
为了体现效果,我们使用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;@Overridepublic 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;}}}
}
```javapackage 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();}}
