wstrzymanie wątku

0

Mam pytanie. Posiadam wątek w którym cały czas czytam z socketa.

    public Thread thread = new Thread(new Runnable() {
        @Override
    public void run() {

        readJson = new JsonParseAndExecute();
            while (running) {

                    byte[] data = new byte[1024];
                    System.out.print("Krece sie \n");
                    int read = read(data, data.length);
                    if (read > 0)
                        readJson.doing(new String(data, StandardCharsets.UTF_8));

            }
    }
});

Czy jest możliwość by go przerwać i chwilowo wywołać inną funkcję łączącą się z socketem a następnie z powrotem przywrócić działanie wątku ?

0

W starszych wersjach Javy korzystało się z wait i notify -> przykład
Teraz jednak korzysta się z bardziej zaawansowanych możliwości języka. Przydatne linki: dokumentacja i tutoriale na jakimś blogu
To się może jeszcze przydać i to również

0

Lepiej korzystać z java.util.concurrency niż jakiegoś wait i notify przynajmnniej tak pan Wojciech powiedział :D

1

Kluczowe pytanie czy możesz przerwać odczyt z tego gniazda, tak by inny wątek mógł z niego skorzystać. Inaczej - czy wykonanie innej niż odczyt operacji z tego gniazda nie popsuje czegoś po drugiej stronie. Jeżeli tak, to:

Sprowadzamy zmienną waitForWriter do wątku czytającego:

class ReadingThread implements Runnable{
    
         volatile boolean waitForWriter = false;


        public void run(){
            while(running){
                while(waitForWriter){}
                // reszta kodu
            }         
       }
}

class WritingThread implements Runnable{

      WritingThread(ReadingThread socketOwner){
          this.socketOwner = socketOwner;
      }

      public void run(){
           socketOwner.waitForWriter = true;
           // zapis do socketu
           socketOwner.waitForWriter = false;    
     }
}

To jest chyba najprostsza metoda bez używania concurrency API. Inna metoda to użycie współdzielonego ReadWriteLock i odpowiednie ustawianie blokad. Trzeba tylko pamiętać o ich zwalnianiu.

ps. kod zakłada, że zapis może odbyć się w dowolnym momencie. Jeżeli chcemy mieć możliwość wstrzymania zapisu do momentu gdy zakończymy czytanie to ReadWriteLock jest odpowiednim rozwiązaniem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1