有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

多线程Java线程在run()时调用其他方法{while(true){executing here}}

我想知道在Java中是否有可能实现这样的功能

class Running extends Thread {

    private int value;

    public void run() {
        while (true) {
            do stuff;
        }
    }

    public int getValue() {
        return value;
    }
}

public static void main(String[] args){
    Running runner = new Running();
    runner.start();
    int runnerValue = runner.getValue(); // Will I ever get the value?
}

[编辑]

我也想知道这是否是推荐的

[Edit2]

我知道,如果在run()方法中更改,该值可能会出错。我更感兴趣的是

private final int VALUE = 100;

很抱歉我说的模棱两可


共 (3) 个答案

  1. # 1 楼答案

    从纯程序的角度来看,代码是可以的,您将得到一个值

    但从逻辑角度来看,代码是不好的。跑步者getValue()在runner之后立即调用。开始()。假设runner要计算一个值,并且getValue()在主线程中执行。因此,当在主线程中执行getValue()时,无法确定运行线程将执行什么,因此getValue()将返回一个您不想要的值

  2. # 2 楼答案

    我建议尝试一下,但我认为会发生以下情况:

    1. 线程将被创建并开始运行
    2. 主程序将获得该值,但线程仍将运行

    如果需要等待某些业务逻辑完成,则应该在两个线程之间使用同步。第一个线程应该调用wait方法,第二个线程应该在完成时调用notify方法,这样第一个线程就会收到通知

  3. # 3 楼答案

    runner.start()将在单独的线程中执行run方法,并立即继续下一行runnerValue将被分配给类中的value,该值将为0,除非:

    • 您的run方法正在更改value的值
    • 它已经有时间去做了(这是非常不可能的,因为启动线程可能需要太长时间才能允许这种情况发生)
    • 幸运的是,你可以从主线程中看到这种变化——你没有使用任何形式的同步来读取主线程中的value,因此不能保证你能看到这种变化