我有一个类是日志服务器的侦听器。每当日志/文本喷出时,侦听器都会收到通知。我将此文本存储在数组列表中。
我需要处理此文本(删除重复的单词,将其存储在 trie 中,将其与某些模式进行比较等)。
我的问题是我应该在通知听众时这样做吗?或者我应该创建一个单独的线程来处理处理。
处理这种情况的最佳方法是什么?
我有一个类是日志服务器的侦听器。每当日志/文本喷出时,侦听器都会收到通知。我将此文本存储在数组列表中。
我需要处理此文本(删除重复的单词,将其存储在 trie 中,将其与某些模式进行比较等)。
我的问题是我应该在通知听众时这样做吗?或者我应该创建一个单独的线程来处理处理。
处理这种情况的最佳方法是什么?
听起来您正在尝试解决Producer Consumer Problem,在这种情况下 -是的,您应该查看线程。
但是,如果您只需要执行非常基本的操作,每个条目花费的时间不到几毫秒 - 不要让事情过于复杂。如果您将 TreeSet 与 ArrayList 结合使用 - 它会自动负责将重复项排除在外。简单的原子操作(例如验证日志条目)并不是什么大问题,它们需要一个单独的线程,除非新文本以如此快的速度进入,以至于您需要一个线程来忙于处理新的通知.
与 UI 无关的进程我总是在单独的线程中运行该类型的进程,因此它不会挂起您的应用程序屏幕。因此,按照我的观点,您需要使用单独的线程。
这种情况可以使用Queue来解决。最简单的解决方案是拥有一个无界阻塞队列(LinkedTransferQueue是为这种情况量身定制的)和一个有限大小的工作线程池。您将add() / offer()来自侦听器线程的日志条目和take()以使用工作线程进行处理。如果没有可用于处理的日志条目,take()将阻塞线程。
PS LinkedTransferQueue是为并发使用而设计的,不需要外部同步:它基于弱迭代器,就像 Concurrent DS 系列一样。