有谁能解释这个程序?我们不能两次启动一个线程,但我们得到的输出1-20 ..任何人都可以解释一下吗?

时间:2016-01-09 23:10:18

标签: java multithreading

import java.io.IOException;

public class Test implements Runnable {
    private int m, n;

    public synchronized void run() {
        try {
            for (int i = 0; i < 10; i++) {
                m++;
                n++;
                Thread.sleep(100);
                System.out.println(m + ", " + n);
            }
        } catch (InterruptedException e) {
        }
    }

    public static void main(String[] args) {
        try {
            Test a = new Test();
            new Thread(a).start();
            new Thread(a).start();
        } catch (Exception e) {
        }
    }
}

3 个答案:

答案 0 :(得分:3)

你是不对的,你不能两次启动相同的线程。但你不是在这里做的。您将分别开始两个单独的主题。

您的代码基本上与以下内容相同:

        Thread t1 = new Thread(a);
        t1.start();

        Thread t2 = new Thread(a);
        t2.start();

答案 1 :(得分:0)

您正在声明2个不同的线程并一个接一个地运行它们。如果您添加以下代码。

StackPane

您可以轻松查看第一个线程结束的位置,然后第二个线程开始。

答案 2 :(得分:0)

每个线程都需要执行Test类实例中描述的任务。更确切地说是run方法。在您的情况下,两个线程都需要执行Test的任务,但是他们还需要使用此类的相同实例(存储在a引用中)。

问题是run方法是同步,这意味着它使用当前实例的监视/锁定(this - 可通过a引用获得),这意味着两个线程都无法同时执行 。更准确地说,其中一个线程需要等待,直到其他线程完成来自同步块(整个run)的执行代码。

所以在你的情况下

  • 您的一个主题会打印出来
    • a
    • 上输入锁定的同步块
    • 打印值范围1-10
    • 退出已锁定在a
    • 上的同步块
  • 所以现在另一个线程可以
    • a
    • 上输入锁定的同步块
    • 打印值范围为11-20(因为mn每次循环都会增加)
    • 退出已锁定在a
    • 上的同步块