-1

DataBaseManagerAndroid アプリで、アプリのすべてのデータベース操作を管理するクラスを作成しました。

データベースから値を作成、更新、取得するさまざまな方法があります。

ランナブルで実行し、スレッド プール エグゼキュータに送信します。

場合によっては、 this から何らかの値を返す必要がありますRunnable。どうすればそれを達成できますか。コールバックについては知っていますが、メソッドの数が多いため、少し面倒です。

どんな助けでも大歓迎です!

4

2 に答える 2

3

Callableを使用する必要があります:Interface Callable<V>

  1. Runnableと同様に、そのインスタンスは別のスレッドによって実行される可能性があります。
  2. しかし、Runnableより賢い: 結果とチェック済みの例外を返すことができる

使い方はRunnableと同じくらい簡単です:

private final class MyTask extends Callable<T>{
  public T call(){
     T t;
    // your code
       return t;
    }
}

私はT参照型を表すために使用していますString

完了時に結果を取得する:

  • using Future<V>: Future は、非同期計算の結果を表します。計算が完了したかどうかを確認し、完了するまで待機するためのメソッドが提供されています。結果は、計算が完了するとメソッドget()を使用して取得され、必要に応じて準備が整うまでブロックされます。

      List<Future<T>> futures = new ArrayList<>(10);
      for(int i = 0; i < 10; i++){
        futures.add(pool.submit(new MyTask()));  
      }  
    
      T result;  
      for(Future<T> f: futures)
         result = f.get(); // get the result
    

    上記のアプローチの欠点は、最初のタスクの計算に時間がかかり、他のすべてのタスクが最初のタスクよりも前に終了する場合、現在のスレッドは最初のタスクが終了する前に結果を計算できないことです。したがって、別の解決策はCompletionServiceを使用することです。

  • using CompletionService<V>: 新しい非同期タスクの生成を、完了したタスクの結果の消費から分離するサービス。プロデューサーは実行のためにタスクを送信します。コンシューマーは完了したタスクを取得し、完了した順序で結果を処理します。使用方法は次のように簡単です。

    CompletionService<T> pool = new ExecutorCompletionService<T>(threadPool);
    

    そして、pool.take().get()を使用して、呼び出し可能なインスタンスから返された結果を読み取ります。

     for(int i = 0; i < 10; i++){
         pool.submit(new MyTask());
       }
      for(int i = 0; i < 10; i++){
          T result = pool.take().get();
    
       //your another code
      }
    
于 2013-10-21T12:42:08.747 に答える
1

以下は callable を使用するためのサンプルコードです

import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;

    public class Test {
        public static void main(String[] args) throws Exception {
            ExecutorService executorService1 = Executors.newFixedThreadPool(4);     

            Future f1 =executorService1.submit(new callable());
            Future f2 =executorService1.submit(new callable());     
            System.out.println("f1 " + f1.get());
            System.out.println("f1 " + f2.get());

            executorService1.shutdown();
        }

    }


    class callable implements Callable<String> {
        public String call() {
             System.out.println(" Starting callable Asynchronous task" + Thread.currentThread().getName());
             try {
                Thread.currentThread().sleep(1000);
            } catch (InterruptedException e) {          
                e.printStackTrace();
            }
            System.out.println(" Ending callable Asynchronous task" +  Thread.currentThread().getName());
            return Thread.currentThread().getName();
        }
    }
于 2013-10-21T12:40:42.993 に答える