检查Java中的异步线程状态

时间:2019-02-27 15:09:23

标签: multithreading thread-safety thread-sleep java-threads thread-synchronization

我在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中所有方法的状态

感谢您的帮助。

1 个答案:

答案 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秒,如果将来还没有完成,则抛出。