有人能解释一下这个节目吗?我们不能启动一个线程两次,但我们得到的输出是1-20。。有人能解释一下吗? import java.io.IOException; 公共类测试实现可运行{ 私有int m,n; 公共同步的无效运行(){ 试一试{ 对于(int i=0;i

有人能解释一下这个节目吗?我们不能启动一个线程两次,但我们得到的输出是1-20。。有人能解释一下吗? import java.io.IOException; 公共类测试实现可运行{ 私有int m,n; 公共同步的无效运行(){ 试一试{ 对于(int i=0;i,java,multithreading,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+

正确的做法是不能启动同一线程两次。但你不是在这里这么做的。您将启动两个独立的线程,每个线程启动一次

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

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) {
        }
    }
}

你是正确的,你不能启动同一个线程两次。但你不是在这里这么做的。您将启动两个独立的线程,每个线程启动一次

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

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) {
        }
    }
}

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

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

        Thread t2 = new Thread(a);
        t2.start();
public synchronized void run(){
System.out.println(“线程启动”);
试一试{
对于(int i=0;i<10;i++){
m++;
n++;
睡眠(100);
系统输出println(m+“,”+n);
}
}捕捉(中断异常e){
}
System.out.println(“螺纹精加工”);
}

您可以很容易地看到第一个线程的结束位置,然后第二个线程的开始位置。

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

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

        Thread t2 = new Thread(a);
        t2.start();
public synchronized void run(){
System.out.println(“线程启动”);
试一试{
对于(int i=0;i<10;i++){
m++;
n++;
睡眠(100);
系统输出println(m+“,”+n);
}
}捕捉(中断异常e){
}
System.out.println(“螺纹精加工”);
}

您可以很容易地看到第一个线程的结束位置,然后第二个线程的开始位置。

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

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

那么你的情况呢

  • 您的一个线程将打印
    • 输入同步块锁定在
      a
    • 打印范围为1-10的值
    • 退出已锁定的同步块
      a
  • 因此,现在可以使用另一个线程
    • 输入同步块锁定在
      a
    • 打印范围为11-20的值(因为
      m
      n
      将在循环中每次增加)
    • 退出已锁定的同步块
      a

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

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

那么你的情况呢

  • 您的一个线程将打印
    • 输入同步块锁定在
      a
    • 打印范围为1-10的值
    • 退出已锁定的同步块
      a
  • 因此,现在可以使用另一个线程
    • 输入同步块锁定在
      a
    • 打印范围为11-20的值(因为
      m
      n
      将在循环中每次增加)
    • 退出已锁定的同步块
      a

您希望获得什么样的输出?你得到的是什么?请解释一下你需要什么,你期望得到什么?你得到了什么?请解释一下你需要什么