检查java中的异步线程状态

问题描述 投票:0回答:1

我在MyClassB类中有一个方法,它是从MyClassA的方法异步触发的:

public void getProductCall()
{
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                productRequest = service.createS4ProductRequest(getRepriceItems());

//下面是对另一个系统的rest调用String response = pricing.getS4ProductResponse(quote.getAssetQuoteNrAndVrsn(),productRequest); //我正在使用以下2行来检查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中所有方法的状态

谢谢你的帮助。

multithreading thread-safety thread-sleep java-threads thread-synchronization
1个回答
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秒,如果未来未完成,则抛出。

© www.soinside.com 2019 - 2024. All rights reserved.