我正在学习 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中使用Final变量之前,只会使用最后一格数字进行测试。
我以为 New Finder 会实例化一个全新的对象,为什么 finder1 中的变量在 finder4 的范围内进行更改?
最佳答案
I thought the New Finder would instantiate a completely new object, why are the variables from finder1 in scope for finder4 to alter?
如果值是实例字段(即不是静态
),则finder4
不应具有访问finder1
的权限字段。说 new Finder(...)
肯定会实例化一个全新的对象。
线程的输出是否可能以与您预期不同的顺序返回? finder1
的线程可能在 finder4
之后开始或结束,因此您只能看到 finder1
的结果在最后。
关于Java 并发性和范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20641734/