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();
    }
}

运行结果:

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

正如在上面的例子中看到的,当调用线程类实例的 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();
    }
}

运行结果:

Current thread name: main
run() method called

正如在上面的示例中看到的,当调用 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();
    }
}

运行结果:

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)

正如在上面的示例中看到的,再次调用 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();
    }
}

运行结果:

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

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

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

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程