我正在学习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的结果。

08-26 01:09