60

runメソッドにRunnableは戻り型voidがあり、値を返すことができません。しかし、これの回避策があるかどうかは疑問です。

私はこのような方法を持っています:

public class Endpoint {
    public method() {
       Runnable runcls = new RunnableClass();
       runcls.run()
    }
}

メソッドrunは次のようになります。

public class RunnableClass implements Runnable {
    
    public JaxbResponse response;

    public void run() {
        int id = inputProxy.input(chain);
        response = outputProxy.input();
    }
}

responseの変数にアクセスしたいmethod。これは可能ですか?

4

8 に答える 8

77

インターフェイスを使用するCallable<V>代わりに使用しRunnableます。

例:

public static void main(String args[]) throws Exception {
    ExecutorService pool = Executors.newFixedThreadPool(3);
    Set<Future<Integer>> set = new HashSet<>();

    for (String word : args) {
      Callable<Integer> callable = new WordLengthCallable(word);
      Future<Integer> future = pool.submit(callable);
      set.add(future);
    }

    int sum = 0;
    for (Future<Integer> future : set) {
      sum += future.get();
    }

    System.out.printf("The sum of lengths is %s%n", sum);
    System.exit(sum);
}

WordLengthCallableこの例では、インターフェイスを実装するクラスも実装する必要がありCallableます。

于 2012-12-03T13:42:56.800 に答える
16
public void check() {
    ExecutorService executor = Executors.newSingleThreadExecutor();
    Future<Integer> result = executor.submit(new Callable<Integer>() {
        public Integer call() throws Exception {
            return 10;
        }
    });

    try {
        int returnValue = result.get();
    } catch (Exception exception) {
       //handle exception
    }
}
于 2012-12-03T13:47:48.580 に答える
7

Callableクラスを見てください。これは通常、エグゼキュータ サービスを介して送信されます。

スレッドが完了したときに返される将来のオブジェクトを返すことができます

于 2012-12-03T13:42:38.080 に答える
3

1 つの方法として、Future - Callableアプローチを使用する必要があります。

別の方法は、値を返す代わりに、オブジェクトに保持できます

例:

class MainThread {
    public void startMyThread() {
        Object requiredObject = new Object(); //Map/List/OwnClass
        Thread myThread = new Thread(new RunnableObject(requiredObject)).start();
        myThread.join();

        System.out.println(requiredObject.getRequiredValue());    
    }
}



class RunnableObject implements Runnable {
    private Object requiredObject;

    public RunnableObject(Object requiredObject) {
        this.requiredObject = requiredObject;
    }

    public void run() {
        requiredObject.setRequiredValue(xxxxx);
    }
}

オブジェクトスコープは同じスコープにあるため、オブジェクトをスレッドに渡し、メインスコープで取得できます。しかし、最も重要なことは、join() メソッドを使用する必要があるということです。メイン スコープは、そのタスクのスレッドの完了を待機する必要があるためです。

複数スレッドの場合、List/を使用Mapしてスレッドからの値を保持できます。

于 2014-10-08T14:38:28.220 に答える
3

にフィールドを追加するRunnableClassと、 で設定してrun読み込むことができますmethod_。ただし、Runnable(Java キーワード)interfaceは、(概念) インターフェースについて何も伝えないため、貧弱です (API ドキュメントの有用な行のみ:「メソッドの一般的な契約はrun、それが何らかのアクションを実行する可能性があることです。」)。より意味のあるインターフェイスを使用する方がはるかに優れています (何かを返す可能性があります)。

于 2012-12-03T13:46:03.910 に答える
0

callable interfaceを見てください。おそらくこれがニーズに合っているでしょう。run()メソッド内でセッターメソッドを呼び出して、応答フィールドの値を取得することもできます

public void run() {
    int id;
    id =inputProxy.input(chain);
    response = outputProxy.input();
    OuterClass.setResponseData(response);

}
于 2012-12-03T13:43:58.453 に答える