2011-04-22 13 views
6

Mam pytanie przeszkadza mi trochę czasu. Na przykład mam serwer wielowątkowy, gdy otrzyma żądanie, przekazuje to żądanie do modułu obsługi, ten moduł obsługi przetwarza to żądanie. Jedną z przyczyn, dla których serwer wielowątkowy jest: , jeśli nie jest wielowątkowy, gdy serwer przetwarzający to żądanie, w czasie znaczenia, przychodzi kolejne żądanie, to żądanie zostanie odrzucone, ponieważ serwer nie jest dostępny teraz.Alternatywa MultiThreading w Javie

Więc zastanawiam się, czy istnieje alternatywa serwera wielowątkowego, na przykład, możemy utworzyć kolejkę dla serwera bez wielowątkowości? kiedy może pobrać kolejne żądanie z kolejki po zakończeniu jednego.

+0

Jeśli wnioskodawca nie potrzebuje zsynchronizowanej odpowiedzi, wystarczy zaimplementować podstawową usługę przesyłania komunikatów. Komponent, który odbiera połączenia sieciowe, wciąż musi być wielowątkowy, ale po prostu rozlewa dane żądania i zrzuca je do kolejki (FIFO). Masz wątek jednego czytnika, aby odebrać najstarszy komunikat z kolejki do faktycznego przetwarzania. Ten rodzaj modelu był używany od wielu lat i jest powszechny w systemach komunikacji punkt-punkt. – ewh

Odpowiedz

1

Wciąż można mieć silnik z jednym gwintem i serwerem wielowątkowym.

rozważ następujący szkielet - jeśli masz uruchomiony silnik, może on być całkowicie pojedynczy, po prostu przekazując żądania w kolejności, w jakiej zostały odebrane. Pozwala to na stosowanie w logice biznesowej składników niezwiązanych z wątkami i udało się oddzielić warstwę sieci od warstwy logiki biznesowej! Jest to scenariusz korzystny dla obu stron.

class Engine implements Runnable { 

    private final Object requestLock = new Object(); 
    private List<Request> requests = new LinkedList<Request>(); 
    private boolean running = true; 

    private Request nextRequest() { 
     synchronized(requestLock) { return requests.poll(); } 
    } 

    /** 
    * The engine is single threaded. It doesn't care about server connections 
    */ 
    public void run() { 
     while(running) { 
      Request request = nextRequest(); 
      // handle your request as normal 
      // also consider making a mechanism to send Responses 
     } 
    } 
} 
2

Tak, możesz mieć event-based server. Ta możliwość jest oferowana przez pakiet java.nio, ale można użyć struktury, takiej jak netty, zamiast wykonywać ją od zera.

Należy jednak zauważyć, że chociaż uważano, że jest to metoda zwiększania wydajności, wygląda na to, że zwykły serwer wielowątkowy w rzeczywistości jest zgodny z obecnym sprzętem i systemami operacyjnymi pod numerem offers better performances.

2

Tak, można. Czy rozważałeś techniki SEDA-like (tj. Techniki event-driven)? Możesz również zbadać bibliotekę Netty. Wykonuje większość zadań, jeśli chodzi o używanie NIO.