Java 如何使筛选器链线程成为本地线程?

Java 如何使筛选器链线程成为本地线程?,java,multithreading,filter,Java,Multithreading,Filter,我正在尝试实现一个过滤器链,每个传入的消息都是一样的。是否知道如何改进此代码,以避免为每条消息创建FilterChain对象。在这种情况下,制作一个过滤器链作为ThreadLocal(然后要求每个线程返回它的副本)能给我带来什么好处吗 //可能添加到筛选器链的所有筛选器的公共接口 公共接口过滤器{ void doFilter(消息消息、过滤器链); } //过滤器链实现 类过滤链{ 专用最终迭代器过滤器迭代器; 过滤器链(列表过滤器){ filtersIterator=filters.iter

我正在尝试实现一个过滤器链,每个传入的消息都是一样的。是否知道如何改进此代码,以避免为每条消息创建
FilterChain
对象。在这种情况下,制作一个过滤器链作为
ThreadLocal
(然后要求每个线程返回它的副本)能给我带来什么好处吗

//可能添加到筛选器链的所有筛选器的公共接口
公共接口过滤器{
void doFilter(消息消息、过滤器链);
}
//过滤器链实现
类过滤链{
专用最终迭代器过滤器迭代器;
过滤器链(列表过滤器){
filtersIterator=filters.iterator();
}
void doFilter(消息){
if(FilterSitator.hasNext())
filtersIterator.next().doFilter(消息,this);
}
}
//一个抽象的bot类
公共抽象类AbstractBot{
private final Executor Executor=Executors.newFixedThreadPool(4);
私有最终列表筛选器=addFilters();
//处理消息对象
受保护的抽象无效进程(消息);
//子类添加自己的过滤器列表的可重写钩子
受保护列表addFilters(){
返回新的ArrayList();
}
公开作废开始(){
//在开始之前,添加lambda实现的最后一个链内过滤器,
//其唯一目的是将消息对象移交给流程方法
添加((消息,链)->进程(消息));
while(true){
//对传入消息向服务器发出长轮询请求
列表消息=请求消息();
用于(消息:消息){
执行者。执行(()->{
过滤器链=新过滤器链(过滤器);
链式过滤器(消息);
});
}
}
}
}

FilterChain chain=newfilterchain(filters)退出
while
循环?您仍然需要为每条消息创建一个迭代器。现在您正在创建
FilterChain
对象及其迭代器。因此
ThreadLocal
不会有帮助,但是删除不必要的
FilterChain
类会有帮助。您可以在lambda中迭代列表。因为当前您的
FilterChain
类无论如何都不可重用。因此,与其重新设计类使其与
ThreadLocal
一起工作,并为每条消息重新启动内部迭代器,不如在lambda中插入一个for循环,以创建的对象最少的方式获得最简单的解决方案。但是,如果您不喜欢简单而有效的方法,您可以自由地使用所需的所有
ThreadLocals
。ThreadLocal很少是一个好的解决方案,在某些情况下,在使用现有代码时,它们会很方便。如果可能的话(通常是在不使用现有代码库的情况下),最好从一开始就以线程安全解决方案为目标。整个代码的目的还不清楚。1)
过滤器的作用是什么?它不返回结果,因此它的实际用途必须与名称“过滤器”相矛盾。2) 为什么每个
Filter
都将
FilterChain
作为参数,而它却不能对它做任何有用的事情?3) 为什么
FilterChain
仅仅是一个普通循环的包装器,却存在?相关对象是
列表
,它已经在
addFilters()
调用中构造。只需对(Message:messages)executor.execute(()->{for(Filter f:filters)f.doFilter(Message);})使用类似于
的东西即可