我在MyClassB类中有一个方法,该方法是从MyClassA的方法异步触发的:
public void getProductCall()
{
new Thread(new Runnable() {
@Override
public void run() {
try {
productRequest = service.createS4ProductRequest(getRepriceItems());
//下面是对另一个系统的调用 字符串响应= Price.getS4ProductResponse(quote.getAssetQuoteNrAndVrsn(),productRequest); //我使用下面的两行从ClassA的方法中进行检查,以查看此过程是否已结束 setProductResponse(response); productPriceProcessEnded = true;
} catch (Exception e) {
productPriceErrorOccured=true;
e.printStackTrace();
}
}
}).start();
}
这是MyClassA中的一段代码,我用来检查以上方法是否完整。
for(int i=0;i<1000000000;i++)
{
if(!networkAsynCalls.isListPriceErrorOccured())
{
if(networkAsynCalls.isListPriceprocessEnded())
{
return networkAsynCalls.getListReponse();
}
else
{
Thread.sleep(250);
continue;
}
}
else
return null;
}
我可以使用一些内置方法或服务池或其他方法来代替使用此随机的for循环吗? 因为,
1)方法上的该线程在另一个类中 2)在MyClassB类中,我还有更多这样的方法,因此我需要检查MyClassA中所有方法的状态
感谢您的帮助。
答案 0 :(得分:0)
如果我不理解您要执行的操作是调度一些要异步运行的代码,则可以等待它完成(成功或失败)。如果是这种情况,您应该看看Futures。
以下是基于Javadoc的示例:
FutureTask<String> future =
new FutureTask<String>(new Callable<String>() {
public String call() {
// do stuff
return "result";
}});
此代码创建一个对象“ future”,可以将其调用以执行searcher.search(target)。此时,代码完全不执行。您仅具有一个对象,该对象表示可以异步执行的计算。为此,您可以致电:
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(future);
此代码段创建了一个Executor
(这是一个由5个线程组成的固定池),然后将其移交给它来执行。执行程序将从Future
异步运行计算。
Future
提供了一些方法(请参阅Javadoc)来等待完成,取消,检查完成状态等。例如
String result = future.get();
将阻塞,无限期地等待结果。一个get(10,TimeUnit.SECONDS)将等待10秒,如果将来还没有完成,则抛出。