如何在 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>> 

那么这是我的问题:

  1. 如何支持以上三种方式?如何将 Callable 作为变量传递? void signal(int signal) 将 运行 所有具有给定信号键的可调用对象。
  2. 对于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);
}
}