package com.day5.test;
 
/**
 * User: Json
 * Date: 2021/8/15
 *  * 多线程创建方式一  继承Thread
 *  * 1.创建一个继承于 thread类的字类
 *  * 2. 重写thread类的run方法 --> 把你要创建的线程要做的事情 写再 run方法中
 *  * 3. 创建thread类的子类对象
 *  * 4.通过此对象调用start方法
 *
 * 创建多线程方式二
 * 1. 创建一个实现Runnable接口的类
 * 2. 实现类去实现Runnable中的抽象方法 Run()
 * 3. 创建实现类的对象
 * 4. 将此对象作为参数传入到Thread类的构造器中 创建Thread类的对象
 * 5. 通过Thread类的对象调用start()方法
 *
 * // 比较两种创建线程的方式
 * 开发中 优先选择 方式二
 * 原因 :1. 实现的方式没有类的单继承的局限性
 * 例子: 比如 你有三个窗口同时卖票  如果用方式一去创建多线程
 * 你就需要让 卖票这个类 继承 多线程这个类 才能实现同时卖票
 * 但是 卖票这个类在实际开发中有可能会继承其他父类 这时候 就没办法 继承多线程这个类了
 *       2. 实现的方式更适合来处理多个线程有共享数据的情况
 *例子: 比如 你有三个窗口同时卖100张票 如果用方式一去创建多线程
 * 你就需要声明票数这个变量 设置为静态属性 只有设置为静态属性 这样才能三个窗口同时卖这100张票
 * 如果用方式二 你只需要在实现这个接口的类中 声明一个普通的 票数的变量 就可以解决这个问题
 * 
 **/
class MyThread implements Runnable{
   //* 2. 实现类去实现Runnable中的抽象方法 Run()
    @Override
    public void run() {
        for (int i=0;i<=100;i++){
            System.out.println(i);
        }
 
    }
}
 
public class Thread{
    public static void main(String[] args) {
      //   * 3. 创建实现类的对象
        MyThread myThread = new MyThread();
        java.lang.Thread thread = new java.lang.Thread(myThread);
        thread.start();
    }
}

练习 创建使用多线程 方式二

class  MyWindow implements Runnable{
    private   int num=100;
 
    @Override
    public void run() {
        while (true){
            if(num>0){
 
                System.out.println(java.lang.Thread.currentThread().getName()+"卖票 票号为"+num);
                num--;
            }else{
                break;
            }
 
        }
    }
 
}
public class Window {
    public static void main(String[] args) {
        MyWindow myWindow = new MyWindow();
        java.lang.Thread thread = new java.lang.Thread(myWindow);
        thread.setName("窗口1");
        thread.start();
        java.lang.Thread thread1 = new java.lang.Thread(myWindow);
        thread1.setName("窗口2");
        thread1.start();
        java.lang.Thread thread2 = new java.lang.Thread(myWindow);
        thread2.setName("窗口3");
        thread2.start();
 
    }
}