目录

方式一:继承Thread

步骤:

例题1:遍历1-100以内所有偶数

 方式二:实现Runnable接口

步骤:

比较创建线程的两种方式 开发中:优先选择:实现Runnable接口的方式 原因:1、实现的方式没有的类的单继承性的局限性      2、实现的方式更适合来处理多个线程有共享数据的情况

例二:创建三个窗口,总票数为100张

方式一:继承Thread

步骤:

/**
*多线程的创建,方式一:继承Thread
 * 1、创建一个继承与Thread的子类
 * 2、重写Thread的run()方法------>将线程执行的操作声明在方法内
 * 3、创建Thread类的对象
 * 4、同构此对象调用start();
* @author: ----千里之行,始于足下----
* date: 2022/8/11 18:33
* @since JDK 1.8
*/

例题1:遍历1-100以内所有偶数

public class Test1 extends Thread{
//  重写Thread的run方法
    @Override
    public void run() {
        for(int i=1;i<=100;i++){
            if(i%2==0){
                System.out.println(i);
            }
        }
    }

    static class Test2 {
        public static void main(String[] args) {
            Test1 te1 = new Test1();
    //        start的作用①启动线程,②调用当前线程的run()方法
            te1.start();
    //        不能直接调用run()方法的方式启动线程
    //        te.run();
    //        如果再次使用start启动线程,会出行异常:IllegalThreadStateException
    //        te1.start();
    //        若想使用多个线程需要新造对象
            Test1 te2 = new Test1();
            te2.start();

    //        如下操作依然在main线程里执行
            for (int i = 0; i < 100; i++) {
                if (i % 2 != 0) {
                    System.out.println(i + "***************");
                }
            }
        }
    }
}

 方式二:实现Runnable接口

步骤:

/**
 *创建多线程的方式二:实现Runnable接口
 * 1、创建一个实现Runnable接口的类
 * 2、实现类去实现Runnable中的抽象方法:run()
 * 3、创建实现类的对象
 * 4、将此对象作为参数传递到Thread类的构造其中,创建Thread类的对象
 * 5、通过Thread类的对象调用start()
 *
 * 联系:public class Thread implements Runnable
 * 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
*/

class MyThread implements Runnable{
//   重写Runnable的方法
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
//                Thread.currentThread().getName():表示调用当前方法的线程名
                System.out.println(Thread.currentThread().getName()+"--"+i);
            }else {
                break;
            }
        }
    }
}
public class Test4 {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
//        t1是线程,创建多线程时,只需要new Thread();就行
        Thread t1 =new Thread(myThread);
        Thread t2 =new Thread(myThread);
//        ①启动线程
//        ②调用当前线程的run()-->调用了Runnable类型的target的run()
//        ③setName:设置线程名
        t1.setName("线程一");
        t1.start();
        t2.setName("线程二");
        t2.start();
    }
}

比较创建线程的两种方式
开发中:优先选择:实现Runnable接口的方式
原因:1、实现的方式没有的类的单继承性的局限性
      2、实现的方式更适合来处理多个线程有共享数据的情况
 

例二:创建三个窗口,总票数为100张

/**
 * Description:
  *
  *例子:
  *
 * @author: ----千里之行,始于足下----
 * date: 2022/8/11 20:26
 * @since JDK 1.8
 */
class Window extends Thread{
    private static int ticket = 100;

    @Override
    public void run() {
        while (true){
            if(ticket > 0){
//                getName:表示当前线程名,完整写法:this.getName()
                System.out.println(getName()+"卖票,票票数还有:"+ticket);
                ticket--;
            }else {
                break;
            }
        }
    }
    public static class WindowTest {
        public static void main(String[] args) {
            Demo1.Window t1 = new Demo1.Window();
            Demo1.Window t2 = new Demo1.Window();
            Demo1.Window t3 = new Demo1.Window();
            t1.setName("窗口一");
            t1.start();
            t2.setName("窗口二");
            t2.start();
            t3.setName("窗口三");
            t3.start();

        }
    }
}