Java执行器的正确方法?
我对遗嘱执行人有意见。这是正确的使用方法吗? 自程序执行以来,在几个小时内一切正常,但我假设线程的行为开始有点奇怪 VPNConnect线程用于在每奇数整小时重新启动vpn连接。线程检查循环中的时间,并在该时间到来时在数据库中的相应位置设置标志1 另外两个独立线程在循环中执行不同的操作,同时检查vpn线程设置的标志。如果标志已更改为1,则每个线程都允许当前循环结束而不启动另一个循环。完成最后一个循环后,Rzeszowiak和nieruchomigdynia线程将其标志设置为0 现在,如果上述两个标志都设置为0,并且vpn标志等于1,则vpn断开并重新连接,然后vpn线程将其标志设置为0。线程Rzeszowiak i NieruchomosciGdynia看到线程vpn具有标志0,并将其标志设置为1 在接下来的2个小时内,Rzeszowiak和NieruchomosciGdynia线程在vpn线程设置为0时完成其工作。当完整的奇数小时到来时,vpn线程将其标志设置为1,游戏再次开始,正如我前面所述 那有什么问题 在启动程序后的短时间内,一切正常。例如,大约23:00两个线程完成其工作,等待vpn重新启动,然后再次启动工作到01:00,然后再次重新启动vpn工作到03:00,重新启动,等等。。。至少应该是理论上的 然而,实践表明,经过几次(有时是3次,有时是4次,有时是6次-没有规则)之后,会出现以下情况:Java执行器的正确方法?,java,multithreading,executorservice,Java,Multithreading,Executorservice,我对遗嘱执行人有意见。这是正确的使用方法吗? 自程序执行以来,在几个小时内一切正常,但我假设线程的行为开始有点奇怪 VPNConnect线程用于在每奇数整小时重新启动vpn连接。线程检查循环中的时间,并在该时间到来时在数据库中的相应位置设置标志1 另外两个独立线程在循环中执行不同的操作,同时检查vpn线程设置的标志。如果标志已更改为1,则每个线程都允许当前循环结束而不启动另一个循环。完成最后一个循环后,Rzeszowiak和nieruchomigdynia线程将其标志设置为0 现在,如果上述两个
ConfigFile cf = new ConfigFile(args[0], args[1]);
cf.loadFile();
VPNConnect vpnConnectThread = new VPNConnect();
Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(vpnConnectThread,1,60,TimeUnit.SECONDS);
if(cf.getRzeszowiak()!=null && !cf.getRzeszowiak().equals("")) {
RzeszowiakPl rzeszowiakPlThread = new RzeszowiakPl(cf.getRzeszowiak());
Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(rzeszowiakPlThread,1,1,TimeUnit.SECONDS);}
if(cf.getNieruchomsciGdynia()!=null && !cf.getNieruchomsciGdynia().equals("")) {
NieruchomosciGdynia nieruchomosciGdyniaThread = new NieruchomosciGdynia(cf.getNieruchomsciGdynia());
Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(nieruchomosciGdyniaThread,1,1,TimeUnit.SECONDS);}
你所说的
线程开始表现得有点奇怪是什么意思?
?Ivan,问题到底出在哪里?你需要告诉我们你期望发生的事情和实际发生的事情(阅读)。简单地编写代码并希望有人能顿悟是没有成效的。@Ivan,我刚刚更新了整个帖子。希望有帮助。如何声明标志变量?您使用的是volatile
还是AtomicBoolean
?您尝试过其他日志吗?@Slaw,我刚刚描述了问题所在。希望你能帮忙。