Java 中 Thread.start() 和 Thread.run() 的区别

Java 中 Thread.start() 和 Thread.run() 的区别

Java 的多线程概念中, start()run() 是两个最重要的方法。 以下是 Thread.start()Thread.run() 方法之间的一些区别:

1、新线程创建 :当程序调用 start() 方法时,会创建一个新线程,然后执行 run() 方法。 但是,如果直接调用 run() 方法,则不会创建新线程,并且 run() 方法将作为对当前调用线程本身的正常方法调用执行,并且不会发生多线程。
下面通过一个例子来理解它:

class MyThread extends Thread {
    public void run()
    {
        System.out.println("Current thread name: " + Thread.currentThread().getName());
        System.out.println("run() method called");
    }
}

class geekdocsDemo {
    public static void main(String[] args)
    {
        MyThread t = new MyThread();
        t.start();
    }
}
Java

运行结果:

Current thread name: Thread-0
run() method called
Java

正如在上面的例子中看到的,当调用线程类实例的 start() 方法时,会创建一个默认名称为 Thread-0 的新线程,然后调用 run() 方法,其中的所有内容都在 新创建的线程。
现在,尝试直接调用 run() 方法而不是 start() 方法:

class MyThread extends Thread {
    public void run()
    {
        System.out.println("Current thread name: " + Thread.currentThread().getName());
        System.out.println("run() method called");
    }
}

class geekdocsDemo {
    public static void main(String[] args)
    {
        MyThread t = new MyThread();
        t.run();
    }
}
Java

运行结果:

Current thread name: main
run() method called
Java

正如在上面的示例中看到的,当调用 MyThread 类的 run() 方法时,没有创建新线程,并且 run() 方法在当前线程即主线程上执行。 因此,没有发生多线程。 run() 方法被称为普通函数调用。

2、多次调用 :在 Java 的多线程概念中, start()run() 方法的另一个最重要的区别是:不能调用 start() 方法两次,否则会抛出 IllegalStateExceptionrun() 方法可以被调用 多次,因为它只是一个普通的方法调用。
下面通过一个例子来理解它:

class MyThread extends Thread {
    public void run()
    {
        System.out.println("Current thread name: " + Thread.currentThread().getName());
        System.out.println("run() method called");
    }
}

class geekdocsDemo {
    public static void main(String[] args)
    {
        MyThread t = new MyThread();
        t.start();
        t.start();
    }
}
Java

运行结果:

Current thread name: Thread-0
run() method called
Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Thread.java:708)
    at geekdocsDemo.main(File.java:11)
Java

正如在上面的示例中看到的,再次调用 start() 方法会引发 java.lang.IllegalThreadStateException。
现在,尝试调用 run() 方法两次:

class MyThread extends Thread {
    public void run()
    {
        System.out.println("Current thread name: " + Thread.currentThread().getName());
        System.out.println("run() method called");
    }
}

class geekdocsDemo {
    public static void main(String[] args)
    {
        MyThread t = new MyThread();
        t.run();
        t.run();
    }
}
Java

运行结果:

Current thread name: main
run() method called
Current thread name: main
run() method called
Java

正如在上面的示例中看到的,调用 run() 方法两次不会引发任何异常,它会按预期执行两次,但在主线程本身上执行。

start()方法 run()方法
创建一个新线程并在新创建的线程上执行 run() 方法 会创建新线程,并且在调用线程本身上执行 run() 方法
不能多次调用,否则抛出 java.lang.IllegalStateException 可以多次调用
java.lang.Thread 类中定义 java.lang.Runnable 接口中定义并且必须在实现类中被覆盖

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册