首页 > 编程语言 > 详细

多线程 - Thread.start() vs Thread.run()

时间:2020-03-07 16:13:27      阅读:47      评论:0      收藏:0      [点我收藏+]

1.Thread.start和Thread.run是什么?

Thread中的start()方法是什么?

线程类的start()方法可以用来启动线程;该方法会在内部调用Runnable接口的run()方法,以在单独的线程中执行run()方法中指定的代码。

start()方法启动线程执行以下任务:

  1. 它统计了一个新线程
  2. 线程从New State移动到Runnable状态。
  3. 当线程有机会执行时,它的目标run()方法将运行。

Thread中的run()方法是什么?

线程类的run()方法是Runnable接口的一个抽象方法,由java虚拟机直接调用的,不会创建的新线程。

 

2.start()方法和run()方法的区别有哪些

方法的定义

  • start()方法在java.lang.Thread类中定义;
  • run()方法在java.lang.Runnable接口中定义,必须在实现类中重写。

新线程创建

  • 当程序调用start()方法时,会创建一个新线程,然后执行run()方法。
  • 但是如果我们直接调用run()方法,则不会创建新的线程,run()方法将作为当前调用线程本身的常规方法调用执行,并且不会发生多线程。

调用start()代码示例

class MyThread extends Thread {
    public void run() {
        System.out.println("\n");
        System.out.println("当前线程的名称: " + Thread.currentThread().getName());
        System.out.println("run()方法调用");
    }
}


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

 

输出:

技术分享图片

正如我们在上面的例子中所看到的,当我们调用线程类实例的start()方法时,会创建一个新的线程,默认名称为Thread-0,然后调用run()方法,并在其中执行所有内容。新创建的线程。

调用run()代码示例

现在,让我们尝试直接调用run()方法而不是start()方法:

class MyThread extends Thread {
    public void run() {
        System.out.println("\n");
        System.out.println("当前线程的名称: " + Thread.currentThread().getName());
        System.out.println("run()方法调用");
    }
}


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

 

输出:

技术分享图片

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

多次调用

  • start()方法不能多次调用,否则抛出java.lang.IllegalStateException;
  • run()方法可以进行多次调用,因为它只是一种正常的方法调用。

 

参考

https://baijiahao.baidu.com/s?id=1624067920453033349&wfr=spider&for=pc

多线程 - Thread.start() vs Thread.run()

原文:https://www.cnblogs.com/frankcui/p/12434430.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!