我试图理解java中的线程。我接受了这个代码,但我再次对所有线程是一起开始还是一个接一个地感到困惑? 所以,如果有人能够详细解释这个简单代码的工作原理,那么对我来说真的很有帮助。 提前谢谢。
以下代码:
public class Threadtom3 implements Runnable {
Thread t;
public void run() {
for (int i = 10; i < 20; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
try {
// thread to sleep for 1000 milliseconds
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e);
}
}
}
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(new Threadtom3());
// this will call run() function
t1.start();
Thread t2 = new Thread(new Threadtom3());
// this will call run() function
t2.start();
Thread t3 = new Thread(new Threadtom3());
t3.start();
}
}
答案 0 :(得分:2)
线程内部代码的执行顺序始终由源代码定义,但线程之间的执行顺序不是。这意味着:
threadtom3
实例并逐个启动线程run
方法,因此它们会并行运行,但它们彼此不了解Sleep
语句,它可能看起来像那样,但你真的不知道。例如,您还不知道在创建run
之前是否执行了t1
t2
方法,反之亦然。我希望这可以帮助您了解线程的工作原理
答案 1 :(得分:1)
当调用Thread.start()
时,并行处理在该线程上开始。但是,无法保证何时调用run
方法。
答案 2 :(得分:0)
程序从main开始,因此将有一个deamon线程(后台线程)将开始运行i,例如,主线程。
以后你已经在另一个t1,t2 t3之后启动了3个用户线程(使用start())。 JVM不保证这些线程序列的执行,因为它们(t1,t2,t3)彼此不了解。每当我们执行
时,它都可以以任何方式(随机)Random threads execution
Thread-0 10
Thread-1 10
Thread-2 10
Thread-0 11
Thread-2 11
Thread-1 11
Thread-1 12
Thread-0 12
Thread-2 12
Thread-1 13
Thread-0 13
Thread-2 13
Thread-1 14
Thread-2 14
Thread-0 14
Thread-1 15
Thread-2 15
Thread-0 15
Thread-1 16
Thread-2 16
Thread-0 16
Thread-0 17
Thread-1 17
Thread-2 17
Thread-0 18
Thread-2 18
Thread-1 18
Thread-0 19
Thread-2 19
Thread-1 19
答案 3 :(得分:0)
这里有四个主题。首先,主线程 - 每个java程序都有 - 由jvm本身启动。您可以将main方法视为第一个run()方法。
当主线程命中第一个start()mathod时,会创建第二个执行run()方法的线程。
从这里开始 - 你无法确定两个现有线程中的哪一个会更快,因为这是由jvm的具体实现来处理的。这意味着你无法判断run-methods for-loop或者是否创建了线程t2。
主线程将继续创建线程t2和t3,而第一个线程t1的run方法执行时伴随着相应的run() - t2和t3的方法。
当三个创建的线程t1-t3的for循环根据jvm sheduler规则进行竞争时,主线程等待直到删除所有对象,这将是所有三个run() - 方法完成时的情况因此,所有三个创建线程的实例都被销毁。
因此,所有四个线程的创建都是线性的,主线程将持续直到所有其他线程都关闭,但三个显式创建的线程关闭的顺序有些不可预测。
答案 4 :(得分:-1)
使用start()调用Runnable的run()方法是异步执行的。这意味着所有3个线程都可以但不能同时运行。