解释多线程java程序执行所需的Anton

解释多线程java程序执行所需的Anton,java,multithreading,synchronized,Java,Multithreading,Synchronized,我正在努力学习java中的多线程。我编写了这个示例代码,以获取一个随机数,并在该数为正整数时退出。在这里,我使用synchronized来检查它是如何工作的。由于方法gererateRandom()是同步的,所以我的期望是只允许一个线程进入函数内部。虽然没有共享变量,但我只是检查它是如何工作的 程序运行正常,但我期望的是,当线程得到一个正数时,它应该退出程序,其他线程应该被阻塞。但我得到的结果完全不同。请检查代码下面的结果部分 import java.util.Random; public c

我正在努力学习java中的多线程。我编写了这个示例代码,以获取一个随机数,并在该数为正整数时退出。在这里,我使用
synchronized
来检查它是如何工作的。由于方法
gererateRandom()
是同步的,所以我的期望是只允许一个线程进入函数内部。虽然没有共享变量,但我只是检查它是如何工作的

程序运行正常,但我期望的是,当线程得到一个正数时,它应该退出程序,其他线程应该被阻塞。但我得到的结果完全不同。请检查代码下面的结果部分

import java.util.Random;

public class CheckNumbnerThread implements Runnable{

Thread t;
int n ;
CheckNumbnerThread() {
      t = new Thread(this);
      System.out.println("Child thread: " + t);
      t.start(); // Start the thread
   }

@Override
public void run() {
    gererateRandom();
}

public synchronized int gererateRandom(){
    Random rn = new Random();
    n = rn.nextInt() % 100;
    System.out.println("The random number generated is " + n);
    if (n > 0){
        System.exit(0);
    }

    return n;       
} 
}

public class DemoThread {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    int counter = 0;
    while(true){
        new CheckNumbnerThread();
        counter++;
        System.out.println("Thread counter " + counter);

    }
}
}
子线程:线程[thread-0,5,main] 线程计数器1 子线程:线程[thread-1,5,main] 生成的随机数为79 线程计数器2 子线程:线程[thread-2,5,main] 生成的随机数为27 线程计数器3 子线程:线程[thread-3,5,main] 生成的随机数为-7 线程计数器4 子线程:线程[thread-4,5,main] 生成的随机数为-68 线程计数器5 子线程:线程[thread-5,5,main] 生成的随机数为20 线程计数器6 子线程:线程[thread-6,5,main] 生成的随机数为67 线程计数器7 子线程:线程[thread-7,5,main] 生成的随机数为13 线程计数器8 子线程:线程[thread-8,5,main] 生成的随机数为56 线程计数器9 子线程:线程[thread-9,5,main] 生成的随机数为93

但我所期望的是,它应该在打印后停止执行:

子线程:线程[thread-0,5,main] 线程计数器1 子线程:线程[thread-1,5,main] 生成的随机数为79


这不是我的想法。由于已经同步了方法gererateRandom(),因此您要确保的是,不会有多个线程同时执行此方法


但是,由于此方法的执行没有限制,因此所有线程都将等待执行此方法的时间,但是所有这些都将被执行。

您的
synchronized
仅适用于该线程的实例,不会像您的代码那样阻止该方法在多个线程上并行运行。如果要在所有实例上同步,请在类上同步

synchronized (CheckNumbnerThread.class) {
    n = rn.nextInt() % 100
    // ...
}

如果否决票能解释一下为什么这不是一个有用的答案,我将不胜感激。感谢您提供的代码显示,1个线程将生成随机数,并在该数为正时退出。在main方法中,您正在生成无限线程。结果是,对于您创建的每个CheckNumber线程,它将打印一个正数,然后退出。您应该尝试将generateradom()方法放在一个单独的类中,并让线程调用该类。在这种情况下,程序将处于无限循环中,不会终止,但程序会终止。