несколько потоков - эксклюзивный доступ к переменной члена класса? - PullRequest
0 голосов
/ 21 января 2012

У меня есть класс, который хранит несколько строк и целых чисел.Эти значения постоянно обновляются моей программой.

В этой же программе у меня также есть простой сокет-сервер, который обрабатывает входящие запросы на данные, содержащиеся в объекте моего класса.Поскольку код сервера содержит цикл while(true), я предполагаю, что мне нужно поместить код в отдельный поток.Иначе ничего не будет выполнено, как только я войду в этот цикл?Затем я передам ссылку на мой класс потоку сервера, чтобы можно было получить значения.

static ServerSocket socket1;
static Socket connection;

while (true) {
    connection = socket1.accept();
    ...
 }

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

1 Ответ

1 голос
/ 21 января 2012

Вы можете реализовать интерфейс runnable и записать свой цикл в методе run ().

public class SocketClass implements Runnable {
  // variables

  // running the thread
  public void run() {
    while(true) {
      // loop
    }
  }
}

В главном потоке вы можете затем начать новый поток с new Thread(...).start().

* 1006.*

Затем у вас есть ссылка на ваш SocketClass, где вы можете получить доступ к переменным.При чтении или обновлении данных вам следует выполнять синхронизацию в классе или на объекте, с которым вы работаете.

// in main thread
synchronized(socket) {
  // read data
}

// in SocketClass
synchronized(this) {
  // write data
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...