Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的多线程问题:当不再调用update方法时,如何清除列表中的最后一个元素?_Java_Multithreading_Client - Fatal编程技术网

Java中的多线程问题:当不再调用update方法时,如何清除列表中的最后一个元素?

Java中的多线程问题:当不再调用update方法时,如何清除列表中的最后一个元素?,java,multithreading,client,Java,Multithreading,Client,我在一个项目中遇到了这个问题: 我有一个通过服务器发送的元素列表,每次服务器调用我的客户机的更新方法时,我都有该列表的本地副本 update方法本身检查新发送的列表是否与本地副本相同,如果不相同,请修改本地副本。这意味着,如果在服务器上,元素不再存在,则应将其从本地副本中删除 当服务器上的最后一个元素消失时,问题就会出现:一旦消失,服务器就会停止调用update方法。这意味着在再次调用update方法之前,本地副本只有一个元素,因为只有在服务器有数据要发送时才会调用它 现在我无法更改服务器体系结

我在一个项目中遇到了这个问题:

我有一个通过服务器发送的元素列表,每次服务器调用我的客户机的更新方法时,我都有该列表的本地副本

update方法本身检查新发送的列表是否与本地副本相同,如果不相同,请修改本地副本。这意味着,如果在服务器上,元素不再存在,则应将其从本地副本中删除

当服务器上的最后一个元素消失时,问题就会出现:一旦消失,服务器就会停止调用update方法。这意味着在再次调用update方法之前,本地副本只有一个元素,因为只有在服务器有数据要发送时才会调用它

现在我无法更改服务器体系结构,也无法更改当列表为空时它不调用该方法的事实。我只能修改客户端

我一直在我的客户机上尝试线程,如果列表在一段时间内没有更新,则让某种线程并行运行以清除列表。这并没有正确或有效地工作,我似乎得到了随机的结果,这些结果可以通过改变线程运行的频率而完全改变

我的主要问题是因为我似乎找不到一种有效的方法来判断我是否正在积极接收数据。我似乎也找不到检查线程当前是否被阻塞的方法


关于我如何处理这个问题有什么想法吗?我对线程/多线程不是很在行,我已经有一段时间在这堵墙上碰头了。

看到一些代码将有助于提供更具体的答案,但是如果您所采用的方法在概念层面上有效,您可以查看Java类并创建一个TimerTask,该TimerTask调用一个方法,该方法检查列表最后一次更新的时间,并在适当的情况下清除它。

如果出现这种情况,请使用AtomicReference。该方法的好处可在该链接中找到

在不直接通知服务器已完成/不包含数据的情况下,您需要利用一些其他要求或条件,作为清除最终元素的提示。您提到服务器可能会发送具有相同数据的更新,这是否意味着需要定期更新?服务器在某些情况下接收数据,例如雷达数据。当它没有接收到任何数据时,它不会更新,但只要有什么东西触发了雷达,服务器就会发送数据。我刚刚尝试了我自己的计时器线程,它似乎在做这项工作,但让我的CPU陷入100%:我要尝试java timer类,它可能比我能做的更有效。哈,好的,计时器类的效率更高!我之前所做的是,我在更新方法内部启动线程,现在我在外部启动计时器,然后单独关闭它,一切正常。谢谢