Exceção de estado de monitor ilegal

Como passar o segmento de pesquisa para outro segmento para processamento. A execução do programa está em uma class de controlador que possui um método principal e um conjunto de encadeamentos:

A class principal Controller

public static void main(String[] args) throws InterruptedException { RunnableController controller = new RunnableController(); System.out.println(incomingQueue.size()); controller.initializeDb(); controller.initialiseThreads(); System.out.println("Polling"); controller.initialUpdate(); } 

O método que possui o encadeamento para a class Polling

  private void initialiseThreads() { try { threadExecutorRead = Executors.newFixedThreadPool(10); PollingSynchronizer reader = new PollingSynchronizer(incomingQueue,dbConnection); threadExecutorRead.submit(reader); }catch (Exception e){ e.printStackTrace(); } } 

O método que tem o encadeamento para a class proccesor

  private void initialUpdate() { RunnableController.outgoingQueue = incomingQueue; if((RunnableController.outgoingQueue)!= null){ try { threadExecutorFetch = Executors.newFixedThreadPool(10); MessageProcessor updater = new MessageProcessor(outgoingQueue, dbConnection); threadExecutorFetch.submit(updater); DBhandler dbhandler = new DBhandler(); dbhandler.updateDb(getOutgoingQueue()); } catch (Exception e) { } } } 

A class Poller e a class do controlador

  public void run() {// Thread in the Poller class int seqId = 0; while(true) { List list = null; try { list = fullPoll(seqId); if (!list.isEmpty()) { seqId = list.get(0).getSequence(); incomingQueue.addAll(list); this.outgoingQueue = incomingQueue; System.out.println("waiting"); System.out.println("new incoming message"); while(true){ wait(3000); notify(); } } } catch (Exception e1) { e1.printStackTrace(); } } } public void run() {// Second thread in the Processor Class synchronized (this){ RunnableController.setOutgoingQueue(generate(outgoingQueue)); } notify(); } } 

Minha tarefa e pergunta é:

O controlador 1.The deve segurar ambos os segmentos Poller & processador e deve somente chamar o fio do poller & do processador

2.Agora, minha pergunta é como fazer o encadeamento do poller esperar por 3 segundos e paralelamente notificar o processador.

Eu recebo o erro da seguinte forma:

 java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at PollingSynchronizer.run(PollingSynchronizer.java:76) at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 

Como conseguir o processamento asynchronous aqui?

Você precisa ler algo assim primeiro. Você não pode usar wait() sem segurar o monitor do object. Além disso, de uma olhada rápida, parece que você usa um membro estático não final em um contexto multithreading. Tente fazer isso seguro para o thread.

    Intereting Posts