-1

1 つのメソッドで複数の Web サービスを呼び出す必要があります。各 Web サービスは、並行/並列で別々のスレッドによって実行されます。すべての Web サービスは 1 つを返し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 - runを検討してくださいCallable - 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 に答える