gpt4 book ai didi

java - 非法监控状态异常

转载 作者:行者123 更新时间:2023-12-02 07:17:19 24 4
gpt4 key购买 nike

如何将轮询线程传递给另一个线程进行处理。程序执行在一个 Controller 类中,该类有一个 main 方法和一个线程池:

主类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();

}

具有 Polling 类线程的方法

 private void initialiseThreads()
{
try {

threadExecutorRead = Executors.newFixedThreadPool(10);
PollingSynchronizer reader = new PollingSynchronizer(incomingQueue,dbConnection);
threadExecutorRead.submit(reader);

}catch (Exception e){
e.printStackTrace();
}

}

具有处理器类线程的方法

    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) {

}
}

}

轮询器类和 Controller 类

    public void run() {// Thread in the Poller class 
int seqId = 0;
while(true) {
List<KpiMessage> 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();
}
}

我的任务和问题是:

1. Controller 应该处理轮询器和处理器线程,并且应该只调用轮询器和处理器线程

2.现在我的问题是如何让轮询器线程等待3秒并并行通知处理器。

我收到如下错误:

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)

这里如何实现异步处理?

最佳答案

您需要阅读类似 this 的内容第一的。如果不持有对象的监视器,则无法使用 wait()。另外,乍一看,您似乎在多线程上下文中使用了非最终静态成员。尝试使其线程安全。

关于java - 非法监控状态异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14772236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com