我正在学习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”将实例化一个全新的对象,为什么finder4的作用域中的finder1中的变量要改变?
最佳答案
我以为“ New Finder”将实例化一个全新的对象,为什么finder4的作用域中的finder1中的变量要改变?
如果值是实例字段(即不是static
),则finder4
不应访问finder1
字段。说new Finder(...)
肯定会实例化一个全新的对象。
线程的输出是否可能以与您期望的顺序不同的顺序返回? finder1
的线程可能在finder4
之后开始或结束,因此您只能在最后看到finder1
的结果。