使用runnable进行线程解释

时间:2016-06-16 10:34:54

标签: java multithreading

我试图理解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();

    }
} 

5 个答案:

答案 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个线程都可以但不能同时运行。