我正在编写一个服务器-客户端程序,这是我的代码的简化图:

public static void main (String[] args){

       function1();
       System.out.println(object1.getField1());
}


客户类别:

class client {
public function1(){
//connecting to server and writing the field value to dataOutoutStream
}


serverClass:

class Server{
    //accepting client and reading the value from dataInputStream
    new Thread(new Runnable() {
        public void run() {
           object1.setField1(//something);
        }
    }
    }).start();
}


在function1中的某个位置,我连接了服务器,它运行一个线程,该线程更改了object1的field1。

但是问题在于,在实际更改字段之前,它会打印先前的值。
如何使function1阻塞,以便可以防止出现此问题?

最佳答案

问题是function1()似乎正在生成一个新线程来执行长时间运行的任务。但是它不等待它完成。因此,调用方(即您的main()方法)看不到更改后的getField1()值。

你必须 ,


获取该长时间运行任务的Future或句柄,以便您可以选择阻止或等待它。
修改function1()以返回Future
等待未来


private static final ExecutorService executorService = Executors.newSingleThreadExecutor();

private Future<?> function1() {
        return executorService.submit(() -> {
            // your long running task which updates **field1**
        });
}

public static void main (String[] args){
       Future<?> resultFuture = function1();
       // wait on this future , i.e. block
       resultFuture.get();
       System.out.println(object1.getField1());
}

关于java - 如何使函数在java中阻塞?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62435877/

10-11 01:06