执行人遇到一些问题。这是使用它们的正确方法吗? 自程序执行以来的几个小时,一切工作正常,但随后我认为线程开始表现得有些奇怪...
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-没有规则)会出现以下情况:
我感到奇怪的是,一段时间之后,这些线程丢失了,甚至消失了。当我停止整个程序并再次运行时,一切恢复正常(在数据库状态下没有任何手动干预)。这种情况有时可以持续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);}