Java 并发性和范围

标签 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);
    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/

相关文章:

ruby-on-rails - Rails-将数据从后台作业传递到主线程

c# - 当项目在枚举时发生变化会影响枚举吗?

java - 在单个节点中运行 Spark 计算

java - Eclipse 中的 Tomcat 服务器超时

java - 使用 AsyncTask 获取 JSON 时,ProgressDialog 永远不会被关闭

c++ - std::move 给出了将 std::string 移动到另一个线程的错误

java - 在显示 Firebase 查询的 RecyclerView 的开头插入对象

java - 使用run方法启动一个观察者线程

java - 如何终止子线程的父线程?

C#异步等待实现