-1

我必须在一种方法中调用多个 Web 服务,每个 Web 服务由并发/并行中的单独线程执行。每个 Web 服务都会返回一个ArrayList. 注意:在这种情况下,某些 Web 服务可能会失败或需要更多时间来处理响应,我必须跳过这些失败结果。我怎样才能做到这一点?我试过这个示例代码

public class MultiThreadsEx{     

    public class Task implements Runnable {  
    private Object result;          
    private String id;      
    int maxRowCount = 0;    
    public Task(String id) {              
        this.id = id;          
    }            
    public Object getResult() {
        return result;          
    }            
    public void run() {              

        try {  
            System.out.println("Running id=" + id+" at "+Utilities.getCurrentJavaDate("DD/MM/YYYY HH:MM:SS"));  
            if(id.equalsIgnoreCase("1")){
                /**Getting Details from Amazon WS*/
                maxRowCount = AmazonUtils.getweather(cityname);
            }else if(id.equalsIgnoreCase("2")){
                /**Getting Details from Google WS* /
                maxRowCount = GoogleUtils.getWeather(cityName);
            }
            // call web service                  
            //Thread.sleep(1000);                  
            //result = id + " more";      
            result = maxRowCount;
        } catch (InterruptedException e) {                  
            // TODO do something with the error                 
            throw new RuntimeException("caught InterruptedException", e);              
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }         
    }      
    }       
    public  static void runInParallel(Runnable runnable1, Runnable runnable2) {          
        try {              
            Thread t1 = new Thread(runnable1);  
            Thread t2 = new Thread(runnable2);                
            t1.start();              
            t2.start();                

        } catch (Exception e) {             
            // TODO do something nice with exception              
            throw new RuntimeException("caught InterruptedException", e);          
        }      
    }        
    public void foo() {  
        try {
            Task task1 = new Task("1");   
            Task task2 = new Task("2");            
            runInParallel(task1, task2);            
            System.out.println("task1 = " + task1.getResult()+" at "+Utilities.getCurrentJavaDate("DD/MM/YYYY HH:MM:SS"));          
            System.out.println("task2 = " + task2.getResult()+" at "+Utilities.getCurrentJavaDate("DD/MM/YYYY HH:MM:SS"));
        } catch (Exception e) {
            //TODO Auto-generated catch block
            e.printStackTrace();
        }       
    } 

但是run()返回类型是 void 那么如何返回结果呢?高度赞赏示例。我是多线程/并发线程概念的新手,所以如果我做错了什么,请指出我正确的方向。

4

2 回答 2

2

考虑替换Runnable - runCallable - call. 这将允许您从线程任务返回结果:

public class Task implements Callable<Object> { 

     private Object result;

     public Object call() {
          // compute result
          return result;
     } 
}

现在使用ExecutorService

public static void runInParallel(Callable<Object> c1, Callable<Object> c2) {                       
        ExecutorService exec = Executors.newFixedThreadPool(2);
        Future<Object> f1 = exec.submit(c1);
        Future<Object> f2 = exec.submit(c2);
}

稍后在代码中您可以使用f1.get()f2.get()等待任务的结果。

于 2012-06-27T14:39:47.013 回答
0

将 Runnable 的结果传递回创建它的对象的常用方法是将创建对象传递给 Runnable 的构造函数。任务完成后,您可以调用创建对象中的方法并传递结果数据。

于 2012-06-27T14:47:08.033 回答