如何在 ConcurrentHashMap 中存储 Java 个可调用作业
How to store Java Callable job in ConcurrentHashMap
我是多线程的新手,这里有一个问题:
对于 Callable 接口,例如:
public interface Callable<V> {
public V call();
}
现在我需要用三种方法实现 class:
/* register some callable jobs with the signal key */
void register(int signal, Callable cb);
/* unregister */
void unregister(int signal, Callable cb);
/* run all the jobs with the given signal */
void signal(int signal);
我在考虑注册和取消注册功能 我将在 java 中使用 ConcurrentHashMap,一些结构如:
ConcurrentHashMap<Integer, List<Callable>>
那么这是我的问题:
- 如何支持以上三种方式?如何将 Callable 作为变量传递? void signal(int signal) 将 运行 所有具有给定信号键的可调用对象。
- 对于Callable接口,需要实现V call()函数。这个 call() 与 signal() 方法有什么关系?信号应该调用这个 call() 吗?
您可以创建新的 iterface extends callable 并添加您的自定义方法,如 getId。
public interface MyCallable extends Callable<String> {
public int getId();
}
-创建一个已实现的 class,它将实现您的自定义可调用接口。
public class CallableImpl implements Callable<String> {
private Callable action;
private int key;
public CallableImpl (Callable action,int key){
this.action=action;
this.key=key;
}
@Override
public String call() throws Exception {
return action.call();
}
public int getId(){
return key;
}
-register(int signal, Callable cb) 方法将获取可调用对象 class 并存储在对 void signal(int signal) 的 hashmap.On 调用中,它将收集所有操作列表从 hashmap 提交给执行者。
ExecutorService executor = Executors.newFixedThreadPool(10);
void signal(int signal){
for(Callable c:actionList){
//submit Callable tasks to be executed by thread pool
Future<String> future = executor.submit(callable);
//add Future to the list, we can get return value using Future
list.add(future);
}
}
我是多线程的新手,这里有一个问题: 对于 Callable 接口,例如:
public interface Callable<V> {
public V call();
}
现在我需要用三种方法实现 class:
/* register some callable jobs with the signal key */
void register(int signal, Callable cb);
/* unregister */
void unregister(int signal, Callable cb);
/* run all the jobs with the given signal */
void signal(int signal);
我在考虑注册和取消注册功能 我将在 java 中使用 ConcurrentHashMap,一些结构如:
ConcurrentHashMap<Integer, List<Callable>>
那么这是我的问题:
- 如何支持以上三种方式?如何将 Callable 作为变量传递? void signal(int signal) 将 运行 所有具有给定信号键的可调用对象。
- 对于Callable接口,需要实现V call()函数。这个 call() 与 signal() 方法有什么关系?信号应该调用这个 call() 吗?
您可以创建新的 iterface extends callable 并添加您的自定义方法,如 getId。
public interface MyCallable extends Callable<String> {
public int getId();
}
-创建一个已实现的 class,它将实现您的自定义可调用接口。
public class CallableImpl implements Callable<String> {
private Callable action;
private int key;
public CallableImpl (Callable action,int key){
this.action=action;
this.key=key;
}
@Override
public String call() throws Exception {
return action.call();
}
public int getId(){
return key;
}
-register(int signal, Callable cb) 方法将获取可调用对象 class 并存储在对 void signal(int signal) 的 hashmap.On 调用中,它将收集所有操作列表从 hashmap 提交给执行者。
ExecutorService executor = Executors.newFixedThreadPool(10);
void signal(int signal){
for(Callable c:actionList){
//submit Callable tasks to be executed by thread pool
Future<String> future = executor.submit(callable);
//add Future to the list, we can get return value using Future
list.add(future);
}
}