2013-12-17 31 views
0

我学习Java和有关线程和有这样的代码:Java并发和范围

Integer target = (int) (Math.random() * 1000); 
    System.out.println("The number is " + target); 
    Monitor mThread = new Monitor(); 
    mThread.start(); 

    Finder finder1 = new Finder(0,249,target,mThread); 
    Finder finder2 = new Finder(250,499,target,mThread); 
    Finder finder3 = new Finder(500,749,target,mThread); 
    Finder finder4 = new Finder(750,1000,target,mThread); 

    Thread t1 = new Thread(finder1,"T1"); 
    t1.start(); 
    mThread.addThread(t1); 
    Thread t2 = new Thread(finder2,"T2"); 
    t2.start(); 
    mThread.addThread(t2); 
    Thread t3 = new Thread(finder3,"T3"); 
    t3.start(); 
    mThread.addThread(t3); 
    Thread t4 = new Thread(finder4,"T4"); 
    t4.start(); 
    mThread.addThread(t4); 

取景器类接受范围和数量进行检查,看它是否在这个范围内。运行代码时,在Finder中使用最终变量之前,只有最后一个数字范围才会用于测试。

我以为新的Finder会实例化一个全新的对象,为什么finder4的变量在finder4的范围中改变?

+5

显示Finder类的代码。 –

+0

Maurício说什么。在Finder的实现中,这个问题非常明显。它几乎听起来像你正在初始化的字段是静态的。 – Mumbleskates

回答

1

我认为新的Finder会实例化一个全新的对象,为什么finder4的变量在finder4的范围内改变?

如果值实例字段(即,不static)然后finder4不应该访问finder1 S场。说new Finder(...)肯定会实例化一个全新的对象。

线程的输出是否有可能以不同于您预期的顺序返回?可能是finder1的线程在finder4之后开始或结束,因此您刚刚在处看到结果

1

您是否有一些代码正在等待线程完成?难道只有使用finder1的线程有足够的时间来完成计算并在退出程序之前打印结果?

0

整数是不可变的,所以你必须引用Finder类中的另一个变量。

没有Finder的代码很难回答你错了什么,但最好的猜测是你使用共享变量来存储目标,然后他们可以相互改变。原始值永远不会改变,只是在重新分配的过程中丢失。