我正在编写一个服务器-客户端程序,这是我的代码的简化图:
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/