一个类中有一些同步运行的方法。我希望它们异步运行,第一个想法是包装它,并使用switch枚举确定应调用哪个函数。但是对于每个调用的方法,我都需要包装器类中有一个新方法和一个新的枚举。看起来像这样:
public class QueuedShow implements InterfaceShowAlert, Runnable {
private Class Action {
String param1;
public static enum ActionEnum{
NEW, CHECK, UPDATE, DELETE, DISPLAY;
}
public ActionEnum todo;
public Action(ActionEnum todo, Object param){
this.todo=todo;
this.param1=param;
}
}
private BlockingQueue<Action> actionList;
public void run(){
while(true){
Action action=actionList.take(); //THIS waits until queue isn't empty
switch(action.todo){
case NEW: //Call original function
....
}
}
}
public void new(String param){
actionList.add(new Action(NEW, param));
}
}
然后,我了解了反思,并有了一个新主意。那就是使用字符串而不是直接方法调用来调用方法。包装类读取并解析字符串,并使用反射获取类和包含方法。它将参数和Method对象放入一个类,并放入一个队列中。现在,该类使用Method.invoke(params)而不是使用枚举进行切换。但是,这样做的问题是丢失了编译器时间类型检查。
当然,所有这些方法仅适用于无效的方法,但是我们当然也可以使用Future类返回值。
现在有任何已经实现将同步调用转换为异步调用的框架,或者您知道执行此操作的任何其他方法。
建议这样做:
abstract public class Action<T> implements Runnable {
private final T param;
public Action(T param) {
this.param = param;
}
@Override
public final void run() {
work(param);
}
abstract protected void work(T param);
}
与:
ExecutorService exec = Executors.newSingleThreadExecutor();
while (/* more actions need to be done */) {
exec.submit(action);
}
exec.shutdown();
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
问题内容: 我已经开始学习线程同步。 同步方法: 同步块: 什么时候应该使用方法和块? 为什么块比方法更好? 问题答案: 这不是更好的问题,只是有所不同。 同步方法时,实际上是在与对象本身进行同步。对于静态方法,您正在同步到对象的类。因此,以下两段代码以相同的方式执行: 就像您写的一样。 如果要控制到特定对象的同步,或者只想将方法的 一部分 同步到该对象,则指定一个块。如果在方法声明上使用关键字,
我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符
同步调用异步方法最安全的方法是什么?
问题内容: 在Java中制作异步方法的同步版本的最佳方法是什么? 假设您有一个使用以下两种方法的类: 您将如何实现直到任务完成才返回的同步? 问题答案: 看看CountDownLatch。您可以使用以下类似方式模拟所需的同步行为: 您还可以通过2个参与者使用相同的行为,如下所示: 但是,如果您可以控制I 的源代码,建议您重新设计它以返回一个对象。这样,您可以在需要时轻松地在异步/同步行为之间进行切
请看下面给我带来麻烦的方法: 然后是run方法:
本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对