как сделать блокировку функции в java? - PullRequest
0 голосов
/ 17 июня 2020

Я пишу программу сервер-клиент, и вот упрощенное лицо моего кода:

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, я подключаю сервер, и он запускает поток, который изменяет field1 объекта 1.

, но проблема в том, что до того, как поле действительно изменилось, он печатает предыдущее значение. как я могу заблокировать функцию 1, чтобы предотвратить эту проблему?

1 Ответ

0 голосов
/ 17 июня 2020

проблема в том, что function1(), похоже, порождает новый поток для выполнения длительной задачи. Но он не дожидается финиша sh. Следовательно, вызывающий объект, которым является ваш метод main(), не видит измененное значение getField1().

вы должны,

  1. получить Future или обрабатывать эту длительную задачу, чтобы вы могли выбрать ее блокировку или ожидание.
  2. измените function1 (), чтобы вернуть Future
  3. wait on the 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());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...