【发布时间】:2014-07-30 12:46:50
【问题描述】:
我了解到启动线程的推荐方法是在线程对象上调用start() 方法。但这反过来又调用了run() 方法。那为什么不直接调用 run() 方法呢?
这是我尝试过的,但我没有得出任何结论:
public class Tester {
public static void main (String[] args) {
Runner r = new Runner();
Thread t1 = new Thread(r, "Thread A(runnable)");
Thread t2 = new Thread(r, "Thread B(runnable)");
Thread s1 = new Strider("Thread C");
Thread s2 = new Strider("Thread D");
t1.run(); // t1.start();
t2.run(); // t2.start();
s1.run(); // s1.start();
s2.run(); // s2.start();
}
}
class Runner implements Runnable {
private int counter;
public void run() {
try {
for (int i = 0; i != 2; i++) {
System.out.println(Thread.currentThread().getName() + " Runnable: "
+ counter++);
Thread.sleep(1000);
}
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
class Strider extends Thread {
private int counter;
Strider(String name) {
super(name);
}
public void run() {
try {
for (int i = 0; i != 2; i++) {
System.out.println(Thread.currentThread().getName() + ": "
+ counter++);
Thread.sleep(1000);
}
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
输出(使用 start()):变化
Thread A(runnable): 0
Thread C: 0
Thread B(runnable): 1
Thread D: 0
Thread B(runnable): 3
Thread D: 1
Thread A(runnable): 2
Thread C: 1
输出(使用 run()):始终保持不变
main Runnable: 0
main Runnable: 1
main Runnable: 2
main Runnable: 3
main: 0
main: 1
main: 0
main: 1
还请提供您对为什么不直接使用run() 的意见?
【问题讨论】:
-
这个post 可能对你有帮助。
-
调用
run()方法就像在当前线程中调用一个简单的方法。而start()方法调用启动一个新线程并在内部调用run()作为新线程的一部分。 -
@user3218114 这很有帮助,但它似乎是一个旧答案 - 使用 stop()
-
Thread暴露了一个公共的run()方法这一事实可以被视为一个历史错误。
标签: java multithreading runnable