java - Thread start() 和 Runnable run() 有什么区别

标签 java multithreading concurrency runnable

假设我们有这两个 Runnable:

class R1 implements Runnable {
    public void run() { … }
    …
}

class R2 implements Runnable {
    public void run() { … }
    …
}

那么这有什么区别:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();

    r1.run();
    r2.run();
}

还有这个:

public static void main() {
    R1 r1 = new R1();
    R2 r2 = new R2();
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);

    t1.start();
    t2.start();
}

最佳答案

第一个例子:没有多个线程。两者都在单个(现有)线程中执行。不创建线程。

R1 r1 = new R1();
R2 r2 = new R2();

r1r2 只是两个不同的类对象,它们实现了 Runnable 接口(interface),从而实现了 run()方法。当您调用 r1.run() 时,您正在当前线程中执行它。

第二个例子:两个独立的线程。

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);

t1t2 是类 Thread 的对象.当您调用 t1.start() 时,它会启动一个新线程并在内部调用 r1run() 方法以在其中执行它新线程。

关于java - Thread start() 和 Runnable run() 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579657/

相关文章:

java - Java中线程间对象的访问

java - 如何为Executors.newScheduledThreadPool设置RemoveOnCancelPolicy(5)

java - 路径请求必须使用 UserEnvironment 指定用户

c# - 杀死多线程服务器的线程c#

java - OpenCV android函数使用

java - java中多线程的并行执行

c - 线程: Multiple File Access

go - 读取以并发 goroutine 编写的 channel 时缺少最后一个值

java - 如何在整个应用程序中使用一个数据库连接对象?

java - eclipse 远程调试