gpt4 book ai didi

java - 如何在 ConcurrentHashMap 中存储 Java Callable 作业

转载 作者:太空宇宙 更新时间:2023-11-04 10:41:59 24 4
gpt4 key购买 nike

我是多线程新手,这里有一个问题:对于可调用接口(interface),例如:

public interface Callable<V> {
public V call();
}

现在我需要实现一个具有三个方法的类:

/* 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接口(interface),需要实现V call()函数。 call() 与 signal() 方法有何关系?信号应该调用这个 call() 吗?

最佳答案

您可以创建新的 iterface extends callable 并添加您的自定义方法,例如 getId。

 public interface  MyCallable  extends Callable<String> {
public int getId();
}

-创建一个实现类,它将实现您的自定义可调用接口(interface)。

 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) 方法将获取可调用类的对象并存储在 hashmap 中。调用 void signal(int signal) 时,它将从 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);
}
}

关于java - 如何在 ConcurrentHashMap 中存储 Java Callable 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48876059/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com