Java执行器的正确方法?

Java执行器的正确方法?,java,multithreading,executorservice,Java,Multithreading,Executorservice,我对遗嘱执行人有意见。这是正确的使用方法吗? 自程序执行以来,在几个小时内一切正常,但我假设线程的行为开始有点奇怪 VPNConnect线程用于在每奇数整小时重新启动vpn连接。线程检查循环中的时间,并在该时间到来时在数据库中的相应位置设置标志1 另外两个独立线程在循环中执行不同的操作,同时检查vpn线程设置的标志。如果标志已更改为1,则每个线程都允许当前循环结束而不启动另一个循环。完成最后一个循环后,Rzeszowiak和nieruchomigdynia线程将其标志设置为0 现在,如果上述两个

我对遗嘱执行人有意见。这是正确的使用方法吗? 自程序执行以来,在几个小时内一切正常,但我假设线程的行为开始有点奇怪

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次-没有规则)之后,会出现以下情况:

  • vpn线程不会断开和重新连接,尽管Rzeszowiak和Nieruchominiagdynia正在等待它(基础上设置为0)
  • vpn线程断开并重新连接,但Rzeszowiak和NieruchomiamiGdynia线程不会启动
  • 我有一种奇怪的感觉,过了一段时间,这些线索在某处消失了,甚至消失了。当我停止整个程序并再次运行它时,一切都恢复正常(在数据库状态中没有任何手动干扰)。有时候3个小时,有时候6个小时,有时候甚至一天,情况还可以

        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,我刚刚描述了问题所在。希望你能帮忙。