2

これがシナリオであると仮定します。

class A extends TimerTask{
  int a;
  public void run(){
    //operation to be performed periodically
  }
}

class B{
  int delay=2000,interval=3000;
  A objectA;
  public static void main(String[] args){
    Timer t=new Timer();
    t.scheduleAtFixedRate(new A(),delay,interval);
  }
}

run()オブジェクトを返すことができませんか?私がそのような変更を行うと、非互換性が引用されます。なんで?

4

5 に答える 5

4

FutureTaskで(およびFuture)を使用しExecutorServiceます(APIページの例を参照)。


例:

public static void main(String[] args) throws Exception {

     FutureTask<String> future = 
             new FutureTask<String>(new Callable<String>() {
         public String call() {
             try {
                 Thread.sleep(1000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
             return "Hello World!";
         }
     });

     ExecutorService executor = Executors.newFixedThreadPool(10);
     executor.execute(future);

     System.out.println(future.get());
}
于 2011-10-04T08:01:43.913 に答える
4

method-declarationでわかるように、runのreturntypeはvoidです。したがって、メソッドはオブジェクトを直接返すことはできません。しかし、あなたができることは、クラスのインスタンスレベルでオブジェクトを保存し、操作が終了したときに、保存されたオブジェクトを取得できるAメソッドを宣言することです。A

于 2011-10-04T08:05:03.800 に答える
1

ボイドリターンタイプです。しかし、あなたはこのような何かを返すようにすることができます

最も簡単な方法は、おそらく既知の場所に保管することです。たとえば、スレッド名をキーとして、ハッシュテーブルに入れることができます。そして、このハッシュテーブルの場所は、実行可能なオブジェクトのコンストラクターで設定できます。

于 2011-10-04T08:20:53.397 に答える
0

以外のものを返すようにするとvoid、オーバーライドするメソッドのコントラクトを尊重しなくなります。これは、として宣言されTimerTaskています。

public abstract void run();
于 2011-10-04T08:02:28.370 に答える
0

の戻りタイプrun()void、であるため、簡単な答えは「いいえ」です。オブジェクトを返すことはできません。

定期的に実行されるコードから結果を取得する場合は、ScheduledThreadPoolExecutorがTimerの代わりに役立つことがあります。そのメソッドは、結果を取得できるをschedule返します。ScheduledFuture

于 2011-10-04T08:16:58.950 に答える