2015-07-14 5 views
1

Я смущен о том, как продолжить писать свою программу.Запустите Thread in JavafX Service

В основном, он подключается к нескольким последовательным устройствам, а затем обновляет приложение javafX на основе ответов от устройств (сначала мне нужно отправить сообщение на устройство). Так что я сделал, это создать поток для запуска в потоке службы, чтобы моя программа не замерзала, и поток мог приостановиться до тех пор, пока сообщение не будет прочитано (есть задержка между отправкой и получением сообщения через последовательное устройство).

service = new Service() { 
     @Override 
     protected Task<String> createTask() { 
      return new Task<String>(){ 
       @Override 
       protected String call() throws Exception { 
        new Thread(thread).start(); 
        return null; 
       } 
      }; 
     } 
    }; 

Где нить выполняет какой-то цикл, непрерывно отправляя и читая сообщения.

@Override 
public synchronized void run() { 
    while(serialOn && isRunning){ 
     sendMessages(); 
    } 
} 

public synchronized void sendMessages(){ 
    sendSerial1(); 
    this.wait(); 
    sendSerial2(); 
    this.wait(); 
} 

public synchronized void readMessage1(){ // same readMessage2 for the sendSerial2() 
    getMessage(); // updates variables that are bound to the Javafx App 
    this.notify(); 
} 

Но, я думаю, что обслуживание заканчивается (то есть успех или неудача), прежде чем это событие начинает серийный поток. Но я хочу, чтобы служба продолжала работать, пока программа отправляет и получает сообщения.

Сообщите мне, если вам нужно больше кода, оно немного длиннее и требует запуска последовательных устройств, но я могу включить его здесь, если это затрудняет понимание вопроса.

ответ

2

Не создавайте новый поток в методе call() задачи службы.

Служба автоматически создает потоки, на которые будет вызываться вызов(). Если вы хотите контролировать создание и использование потоков, то вы можете (необязательно) supply an executor to the service (хотя в вашем случае вам, вероятно, не нужно это делать, если вы не хотите, чтобы служба была потоком демона).

От Service javadoc:

Если Исполнитель указан на службе, то он будет использоваться для фактического выполнения услуги. В противном случае будет создан и исполнен поток демона.

Так сдвигать код внутри метода Run() из вашей Runnable и поместить его в метод вызова() из задачи для службы (сама задача является Callable, который является Runnable, поэтому имеющей дополнительный Runnable является избыточным и запутанным).

+0

Отлично. Спасибо за помощь!! – artyfrost