在新线程上执行Java回调
发布时间:2020-12-15 04:33:29 所属栏目:Java 来源:网络整理
导读:在此项目中,Manager执行事件排队,并返回事件的结果使用回调(回调不会扩展Runnable).管理器在一个单独的线程上运行,调度事件.一旦事件终止,这个相同的线程就会调用回调.这意味着在前一个事件的回调终止之前,不会调度下一个事件.为了避免这种情况,我想让管理器
在此项目中,Manager执行事件排队,并返回事件的结果使用回调(回调不会扩展Runnable).管理器在一个单独的线程上运行,调度事件.一旦事件终止,这个相同的线程就会调用回调.这意味着在前一个事件的回调终止之前,不会调度下一个事件.为了避免这种情况,我想让管理器为每个回调创建一个新线程,并在那里执行回调.这个解决方案在设计实践方面有多好,有没有更好的方法来实现这一目标?
解决方法
一个简单的回调代码:
import java.util.concurrent.*; import java.util.*; public class CallBackDemo{ public CallBackDemo(){ System.out.println("creating service"); ExecutorService service = Executors.newFixedThreadPool(10); try{ for ( int i=0; i<10; i++){ Callback callback = new Callback(i+1); MyCallable myCallable = new MyCallable((long)i+1,callback); Future<Long> future = service.submit(myCallable); //System.out.println("future status:"+future.get()+":"+future.isDone()); } }catch(Exception err){ err.printStackTrace(); } service.shutdown(); } public static void main(String args[]){ CallBackDemo demo = new CallBackDemo(); } } class MyCallable implements Callable<Long>{ Long id = 0L; Callback callback; public MyCallable(Long val,Callback obj){ this.id = val; this.callback = obj; } public Long call(){ //Add your business logic System.out.println("Callable:"+id+":"+Thread.currentThread().getName()); callback.callbackMethod(); return id; } } class Callback { private int i; public Callback(int i){ this.i = i; } public void callbackMethod(){ System.out.println("Call back:"+i); // Add your business logic } } 输出: creating service Callable:1:pool-1-thread-1 Call back:1 Callable:2:pool-1-thread-2 Call back:2 Callable:8:pool-1-thread-8 Call back:8 Callable:3:pool-1-thread-3 Call back:3 Callable:10:pool-1-thread-10 Callable:4:pool-1-thread-4 Call back:10 Callable:7:pool-1-thread-7 Call back:7 Callable:6:pool-1-thread-6 Call back:6 Callable:9:pool-1-thread-9 Callable:5:pool-1-thread-5 Call back:9 Call back:4 Call back:5 摘要: >将Manager替换为您首选的ExecutorService. System.out.println("future status:"+future.get()+":"+future.isDone()); 我认为你会避免它,因此保持高于评论.您不必为Callback方法调用创建新线程.如果要异步处理Callback事件,可以再创建一个ExecutorService并提交事件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |