0

いくつかのタスクを実行するためのバックグラウンドを実装するための最良の方法を知りたいです。タスク内のいくつかの条件に基づいて、それは終了し、呼び出し元の状態を返します。また、そのバックグラウンドスレッドが実行されている間、呼び出し元のスレッドがその完了を待つのを妨げてはなりません。FutureTaskを試しましたが、すべてが同期して実行されます。

オタクが私を助けてください。

4

3 に答える 3

0

Executor を使用できます (Java 1.5 以降) http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Executors.html

Executor executor= Executors.newSingleThreadExecutor();
Future<ReturnType> future = executor.sumbit(new MyCallable<ReturnType>());

// new thread running...
// .......

// synchronize/join.....
executor.shutdown();
executor.awaitTermination(30, TimeUnit.MINUTES);

// also you can do... (Get --> Waits if necessary for the computation to complete, and then retrieves its result.)
ReturnType myreturn = future.get();
于 2013-02-22T15:19:51.503 に答える
0

これは非常に単純な 2 スレッドの例です。それを変更して、必要なほとんどすべてのことを実行できるはずです。キューを使用して結果を返します。コンシューマーpollがキューをどのように処理するかを確認します。メイン スレッドでそれを実行して、スレッドからの結果を待つことができます。

public class TwoThreads {
  public static void main(String args[]) throws InterruptedException {
    System.out.println("TwoThreads:Test");
    new Test().test();
  }
  // The end of the list.
  private static final Integer End = -1;

  static class Producer implements Runnable {
    final Queue<Integer> queue;
    private int i = 0;

    public Producer(Queue<Integer> queue) {
      this.queue = queue;
    }

    @Override
    public void run() {
      try {
        for (int i = 0; i < 1000; i++) {
          queue.add(i++);
          Thread.sleep(1);
        }
        // Finish the queue.
        queue.add(End);
      } catch (InterruptedException ex) {
        // Just exit.
      }
    }
  }

  static class Consumer implements Runnable {
    final Queue<Integer> queue;
    private int i = 0;

    public Consumer(Queue<Integer> queue) {
      this.queue = queue;
    }

    @Override
    public void run() {
      boolean ended = false;
      while (!ended) {
        Integer i = queue.poll();
        if (i != null) {
          ended = i == End;
          System.out.println(i);
        }
      }
    }
  }

  public void test() throws InterruptedException {
    Queue queue = new LinkedBlockingQueue();
    Thread pt = new Thread(new Producer(queue));
    Thread ct = new Thread(new Consumer(queue));
    // Start it all going.
    pt.start();
    ct.start();
    // Wait for it to finish.
    pt.join();
    ct.join();
  }
}
于 2013-02-22T15:21:34.767 に答える
0

@Grayが示唆したように、調査を行うことがおそらく最善の方法です。The Fork/Join Framework、またはその他の Executor Servicesをご覧ください。あなたが何をしているのかをもっと知らなければ、何が適切かについてより良い提案をすることは困難です.

これは、どこから始めるべきかの例も示しています。

于 2013-02-22T15:14:52.773 に答える