Java_继承Thread类创建多线程&线程休眠 sleep()

264 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、继承Thread类创建多线程

单线程

因为该程序是一个单线程程序,所以只会循环run()方法的死循环。

单线程程序

public class ExampleM01 {
    public static void main(String[] args) {
        MyThread myThread =new MyThread();  //创建 MyThread 实例对象
        myThread.run(); //调用 MyThread类的 run()方法
        while (true) {  //该循环是个死循环,打印输出语句
            System.out.println("Main方法在运行");
        }
    }
}
class MyThread {
    public void run() {
        while (true) {  //该循环是个死循环,打印输出语句
            System.out.println("MyThread 类的 run()方法在运行");
        }
    }
}

多线程

JDK 中提供了一个线程类 Thread ,通过继承 Thread 类,并重写 Thread 类中的 run ()方法便可实现多线程。

在 Thread 类中,提供了一个 start()方法用于启动新线程,线程启动后,系统会自动调用 run()方法。

多线程程序

public class ExampleM02 {
    public static void main(String[] args) {
        MyThread02 myThread =new MyThread02();  //创建 MyThread 线程对象
        myThread.start();   //开启线程
        while (true) {  //该循环是个死循环,打印输出语句
            System.out.println("Main()方法在运行");
        }
    }
}
class MyThread02 extends Thread{
    public void run() {
        while (true) {  //该循环是个死循环,打印输出语句
            System.out.println("MyThread 类的 run()方法在运行");
        }
    }
}

单线程和多线程区别

在这里插入图片描述

二、线程休眠 sleep()

如果希望人为地控制线程,使正在执行的线程暂停,将 CPU 让给别的线程,这时可以使用静态方法 sleep ( long millis ),该方法可以让当前正在执行的线程暂停一段时间,进人休眠等待状态。sleep ( long millis )方法声明抛出InterruptedException 异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常

案例 ExampleM08:

public class ExampleM08 {
    public static void main(String[] args) throws Exception{
        //创建一个线程
        new Thread(new SleepThread()).start();
        for (int i=1;i<=10;i++) {
            if (i==5) {
                Thread.sleep(2000); //当前线程休眠 2秒
            }
            System.out.println("主线程正在输出:"+i);
            Thread.sleep(500);  //当前线程休眠 500毫秒
        }

    }
}
//定义 SleepThread类实现 Runnable接口
class SleepThread implements Runnable {
    public void run() {
        for (int i=1;i<=10;i++) {
            if (i==3) {
                try {
                    Thread.sleep(2000); //当前线程休眠 2秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程一正在输出:"+i);
            try {
                Thread.sleep(500);  //当前线程休眠 500毫秒
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

线程一for 循环中,当i=3时,调用了 Thread 的 sleep (2000)方法(代码的第20行左右),使线程休眠2s。从运行结果可以看出,主线程输出2后,线程一没有交替输出3,而是主线程接着输出了3和4,这说明了线程一进人了休眠等待状态。

主线程for 循环中,当i=5时,也调用了 Thread 的 sleep (2000)方法(代码的第7行左右),使线程休眠2s。从运行结果可以看出,在主线程输出4后,下面连续4句话都是线程一输出的。只有当主线程2s休眠完毕后,两个线程才会恢复交替执行。

需要注意的是,sleep()是静态方法,只能控制当前正在运行的线程休眠,而不能控制其他程序休眠。当休眠时间结束后,线程就会返回到就绪状态,而不是立即开始运行。