使用第二种方式创建线程,原因是执行线程目标对象共享
    为了体现效果,我们使用sleep()方法进行线程睡眠

    public static void sleep(long millis)throws InterruptException(可打断异常)

    当某一个线程调用了sleep方法之后,就会被睡眠(时间自己定 - 毫秒值),睡眠醒了之后会立即被分配到可运行状态,等待CPU调用

    安全问题分析:

    1. 共享数据
    2. 操作共享数据
    3. 一次完整的操作过程,应该是不可分割的执行的,即完整的操作中,不应该被其他的线程抢夺CPU ```java package Test22_Demo.Demo03;/*

      @create 2020—12—15—10:32 */

    public class Ticket implements Runnable {

    1. private int number = 100;
    2. @Override
    3. public void run() {
    4. while (true) {
    5. //线程暂停两秒
    6. try {
    7. Thread.sleep(2000);
    8. } catch (InterruptedException e) {
    9. e.printStackTrace();
    10. }
    11. //如果有票就卖
    12. if (number > 0) {
    13. String threadName = Thread.currentThread().getName();
    14. System.out.println(threadName + "正在销售第"+(number--) + "张票");
    15. } else {
    16. //没票了
    17. break;
    18. }
    19. }
    20. }

    }

    1. ```java
    2. package Test22_Demo.Demo03;/*
    3. @create 2020--12--15--10:44
    4. */
    5. /**
    6. * 测试线程
    7. */
    8. public class ThreadDemo {
    9. public static void main(String[] args) {
    10. //实例化目标
    11. Ticket ticket = new Ticket();
    12. //使用该买票的目标创建多个程序
    13. Thread thread1 = new Thread(ticket, "Jack");
    14. Thread thread2 = new Thread(ticket, "Rose");
    15. Thread thread3 = new Thread(ticket, "Tom");
    16. //启动多个线程
    17. thread1.start();
    18. thread2.start();
    19. thread3.start();
    20. }
    21. }