Java并发性和作用域
我正在学习java和关于线程的知识,并有以下代码:Java并发性和作用域,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在学习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); Find
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中使用Final变量之前,只有最后一组数字用于测试
我以为新的Finder会实例化一个全新的对象,为什么finder1中的变量会在finder4的作用域中改变呢
我以为新的Finder会实例化一个全新的对象,为什么finder1中的变量会在finder4的作用域中改变呢
如果值是实例字段(即非static
),则finder4
不应访问finder1
s字段。说newfinder(…)
肯定会实例化一个全新的对象
线程的输出是否可能以与预期不同的顺序返回?可能是
finder1
的线程在finder4
之后开始或结束,因此您在最后看到的只是finder1
的结果。是否有一些代码等待线程结束?是否只有具有finder1的线程才有足够的时间在退出程序之前进行计算并打印结果?Integer是不可变的,因此您必须引用Finder类中的另一个变量
如果没有Finder的代码,很难回答您的错误,但是最好的猜测是您使用一个共享变量来存储目标,然后它们可以相互改变。原始值从未改变,只是在重新分配时丢失了。显示Finder类的代码。Maurício如是说。问题很明显地出现在
Finder
的实现中;听起来您正在初始化的字段几乎是静态的。