【发布时间】:2020-08-18 04:26:43
【问题描述】:
对于一个班级项目,我使用 concurrentHashMap 来包含活动用户列表及其连接详细信息。多个线程应该能够获取所有活动用户的列表,其中 5 个线程能够修改 hashMap。当我测试它时,它似乎可以工作,但我不知道线程是否被阻塞并且系统是否足够快。
- 想封装concurrentHashMap,不知道会不会停止并发?
我还希望只有一个版本的 hashmap,所以我将类设为枚举,太糟糕了,只需要 main 来创建它?- 我不希望其他线程修改 hashMap,所以我没有传递集合/迭代器。有没有办法在没有删除的情况下传递集合?
- (new) 我在 CoolFeature 中调用了两个方法,一个是阻塞的,一个不是。两者都可以有自己的位置。论文有什么问题吗?
我们使用 Akka Actors 来创建线程和处理并发,我的简化代码如下。这不是作业问题,只是我在项目中创建的部分内容。
编辑:我更改了代码,最好有一个不依赖 Akka 的解决方案,以便其他人可以找到有用的答案。
package server.management;
public class Sessions {
static final ConcurrentHashMap<Integer, Id<User>> sessions = new concurrentHashMap<>();
private Sessions() { }
}
public class SessionManager {
public static void create(int connection, Id<User> userId) {
// checks
Sessions.sessions.put(connection, userId);
}
public static Id<User> getUser(int connection) {
Id<User> userId = Sessions.sessions.get(connection);
return userId;
}
public static ArrayList<Id<User>> getActiveUsers() {
ArrayList<Id<User>> list = new ArrayList<>();
// Don't pass the sessions.values() directly because the Map can be modified.
for (Id<User> userId : Sessions.sessions.values()) {
list.add(userId);
}
return list;
}
// other methods
}
/* Another thread/akka actor class */
package server;
import server.management.SessionManager;
public class CoolFeature extends AbstractActor {
...
Id<User> client = SessionManager.getUser(1023);
// do stuff
CompletableFuture<ArrayList<Id<User>>> futureList =
CompletableFuture.supplyAsync(SessionManager::getActiveUsers);
// do stuff
ArrayList<Id<User>> list = futureList.get();
// do stuff
}
【问题讨论】:
标签: java multithreading akka concurrenthashmap