【问题标题】:Explainanton needed for multithreded java program execution多线程Java程序执行所需的解释
【发布时间】:2014-02-03 07:41:59
【问题描述】:

我正在尝试学习 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[Thread-0,5,main] 线程计数器 1 子线程:Thread[Thread-1,5,main] 生成的随机数是 79 线程计数器 2 子线程:Thread[Thread-2,5,main] 生成的随机数是 27 线程计数器 3 子线程:Thread[Thread-3,5,main] 生成的随机数是-7 线程计数器 4 子线程:Thread[Thread-4,5,main] 生成的随机数是-68 线程计数器 5 子线程:Thread[Thread-5,5,main] 生成的随机数是20 线程计数器 6 子线程:Thread[Thread-6,5,main] 生成的随机数是 67 线程计数器 7 子线程:Thread[Thread-7,5,main] 生成的随机数是 13 线程计数器 8 子线程:Thread[Thread-8,5,main] 生成的随机数是 56 线程计数器 9 子线程:Thread[Thread-9,5,main] 生成的随机数是93

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

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

【问题讨论】:

  • 你给出的代码显示1个线程会产生随机数,当数为正数时退出。在您的主要方法中,您正在产生无限线程。结果是,对于您创建的每个 CheckNumbnerThread,它将打印一个正数,然后退出。您应该尝试将 generateRandom() 方法放在一个单独的类中,并让线程调用该类。
  • 在这种情况下程序将处于无限循环并且不会终止,但程序会被终止。

标签: java multithreading synchronized


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    但是由于这个方法的执行没有限制,发生的事情是你所有的线程只会等待他们的时间来执行这个方法,但它们都会被执行。

    【讨论】:

    • 如果否决票能稍微解释一下为什么这不是一个有用的答案,我将不胜感激。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多