package cn.org.rapid_framework.util.concurrent.async; import java.util.Date; import java.util.concurrent.Callable; import junit.framework.TestCase; import cn.org.rapid_framework.util.concurrent.async.AsyncTokenRunnable; public class AsyncTokenUtilsTest extends TestCase { private Object RESULT = new Object(); private boolean executedResult = false; public void testCallable() throws InterruptedException { final AsyncToken token = new AsyncToken(); Callable task = new Callable() { public Object call() throws Exception { Thread.sleep(1000 * 3); return RESULT; } }; Thread thread = new Thread(new AsyncTokenRunnable(token,task)); thread.start(); Thread.sleep(1500); token.addResponder(new IResponder() { public void onFault(Exception fault) { assertNull(fault); } public void onResult(Object result) { assertEquals(result,result); executedResult = true; } }); assertFalse(executedResult); Thread.sleep(2000 + 500); assertTrue(executedResult); } public void testRunable() { AsyncToken<Date> token = new AsyncToken(); token.addResponder(new IResponder<Date>(){ public void onFault(Exception fault) { } public void onResult(Date result) { } }); token.setComplete(); int count = Integer.MAX_VALUE; System.out.println(count); System.out.println(++count); } public void testSendEmail() { final String address = "badqiu(a)gmail.com"; final String subject = "test"; final String content = "async token test"; //返回的token,包含token.addResponder()用于监听异步方法的执行结果 AsyncToken token = sendAsyncEmail(address,subject,content); //token可以继续传递给外部,以便外面感兴趣的listener监听这个异步方法的执行结果 token.addResponder(new IResponder() { public void onFault(Exception fault) { System.out.println("email send fail,cause:"+fault); //此处可以直接引用address,subject,content,如,我们可以再次发送一次 sendAsyncEmail(address,subject,content); } public void onResult(Object result) { System.out.println("email send success,result:"+result); } }); } public AsyncToken sendAsyncEmail(String address,String subject,String content) { final AsyncToken token = new AsyncToken(); Thread thread = new Thread(new Runnable() { public void run() { try { //do send email job... token.setComplete(); //通知Responder token执行完 }catch(Exception e) { token.setFault(e); //通知Responder token发生错误 } } }); thread.start(); return token; } }