3

ボタンクリックイベントが Thread にタスクを割り当て、 midi メソッドを呼び出して音楽を再生するリアルタイム実行アプリケーションを実装しようとしていました。ボタンが少し遅れてクリックされるとすぐに音楽を開始する必要があります。midi コードは Runnable クラスの run メソッドに実装されています。しかし、ボタンクリックイベント自体が2ミリ秒以上かかってからrunメソッドの最初のステートメントに到達するのに. 新しく作成されたスレッドのコレクションを持つことができ、スレッドによって引き起こされる時間の遅延を減らすため、Executor Service を使用しようとしました。ExecutorService アプリケーションは初めてです。私が観察したのは、ボタンが最初にクリックされたときに2ミリ秒以上かかりましたが、再起動すると遅延が減少しました。しかし、ある段階では4ミリ秒以上に増加しています..この遅延を毎回1ミリ秒未満に維持する方法. ExecutorService またはその他のサービス プロバイダーを使用してそれを行う方法はありますか? これが私のコードです。ExecutorService の使用方法です。使用方法が適切でない場合は、修正してください。

 private static  TestExecutorSerivice obj=new TestExecutorSerivice(3);;
    private void handlePlayButtonAction(ActionEvent event) throws InterruptedException {

Handler.click=System.nanoTime();
    obj.run();
}

TestExecutorService.java

public class TestExecutorSerivice implements Runnable {


private  ExecutorService pool;
public TestExecutorSerivice( int poolSize)
{

 pool = Executors.newFixedThreadPool(poolSize);

}

public void run() { 
 try {
    pool.execute(new Handler());
 } catch (Exception ex) {
   pool.shutdown();
 }
}

}

class Handler implements Runnable {
 public static long click;

  public void run() {
          System.out.println("time taken "+(((double)System.nanoTime()-click)/1000000));
   }
 }

出力:

time taken 2.107673
time taken 1.336642
time taken 0.185161
time taken 0.130059
time taken 1.007243
time taken 4.486807
time taken 0.092783
4

2 に答える 2

0

コメントで言ったように、それは言語に依存しないものです。スレッド実行のギャップを最小限に抑えるために、最小限の最適化を行うことはできません。

これを試してみてください。

private static  TestExecutorSerivice obj=new TestExecutorSerivice(3);;
Handler[] handlers = new Handler[3]; //same as above
for(int i = 0; i<handlers.length; i++)
   handlers[i] = new Handler();
private void handlePlayButtonAction(ActionEvent event) throws InterruptedException {
    Handler.click=System.nanoTime();
    obj.run();
}

そして、あなたのTestExecutorSeriviceクラスのrunメソッドで

public void run() { 
  try {
     pool.execute(handlers[(int)Thread.currentThread().getId()]);
  } catch (Exception ex) {
     pool.shutdown();
  }
}
于 2015-10-16T05:06:25.133 に答える