Explainanton需要多线程java程序执行

时间:2014-02-03 07:41:59

标签: java multithreading synchronized

我正在尝试学习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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:-1)

这不是主意。因为你已经同步了gererateRandom()方法,所以你要保证的是,不会有多个线程同时执行这个方法。

但由于此方法执行没有任何限制,所发生的是所有线程都只是等待他们的时间来执行此方法,但所有这些都将被执行。