Java执行器是正确的方法吗?

时间:2018-07-13 18:24:41

标签: java multithreading executorservice

执行人遇到一些问题。这是使用它们的正确方法吗? 自程序执行以来的几个小时,一切工作正常,但随后我认为线程开始表现得有些奇怪...

VPNConnect线程用于在每个整整一个小时重新启动vpn连接。线程在循环中检查时间和时间,将标志1设置在数据库中。

另外两个独立线程在循环中执行不同的操作,同时检查vpn线程设置的标志。如果该标志已更改为1,则每个线程都允许当前循环结束并且不启动另一个循环。完成最后一个循环后,Rzeszowiak和NieruchomiamiGdynia线程将其标志设置为0。

现在,如果上述两个标志都设置为0并且vpn标志等于1,则vpn断开并重新连接,则vpn线程将其标志设置为0。线程Rzeszowiak i NieruchomosciGdynia看到线程vpn标志0引起工作,将标志设置为1。

在接下来的2个小时中,当vpn线程设置为0时,Rzeszowiak和NieruchomosciGdynia线程执行其工作。当充满奇数小时出现时,vpn线程将其标志设置为1,然后游戏再次开始如上所述。

那是什么问题?

启动程序后的短时间内,一切正常。例如,大约23:00两个线程完成其工作,等待vpn重新启动,然后再次唤起其工作,直到01:00,然后再次重新启动vpn工作,直到03:00,重新启动,等等。至少应该是理论上的...

但是,实践表明,在少数情况下(有时是3,有时是4,有时是6-没有规则)会出现以下情况:

  1. 尽管Rzeszowiak和NieruchomieniaGdynia正在等待,但vpn线程不会断开连接并重新连接(基于0设置)。
  2. 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);}

0 个答案:

没有答案
相关问题