0

スレッドを理解するのに役立つ小さなサンプル プログラムを作成しました。以下のように、2 つのクラス ファイルがあります。

DoBench.java:

package benchmark;

public class DoBench {

    public static void main(String[] args) {
        Benchmark bmark = new Benchmark();
        Thread Timer = new Thread(bmark,"worktimer"); // name doesn't work?
        Timer.start();
        doALotOfWork();
//      Timer.finish(); // didn't work? why??
        bmark.finish();     
    }

    private static void doALotOfWork() {
            for (int i=0;i<10;i++) {
                System.out.println(i);
            }
    }
}

Benchmark.java:

package benchmark;

public class Benchmark implements Runnable {

    long start = 0;
    String timerName = Thread.currentThread().getName();

    public void finish() {
        long diff = (System.currentTimeMillis()-start);
        System.err.println("\n"+timerName + " took " + diff + "ms");
    }

    @Override
    public void run() {
        start = System.currentTimeMillis();
        System.err.println("\nStarted timer " + timerName);
    }
}

出力は次のとおりです。

Started timer main
0
1
2
3
4
5
6
7
8
9

main took 0ms

質問が 2 つあります。

  1. スレッドにアクセスできる名前を付けるにはどうすればよいですか (worktimer)?
  2. Benchmark() ではなく Thread の finish() メソッドにアクセスするにはどうすればよいですか?
4

3 に答える 3

2

呼び出されるコンテキストgetName()が間違っています。

String timerName = Thread.currentThread().getName(); 

理由:上記のコードが実行Threadされると、イン コンテキストはmain threadになります。上記のコードは実装の初期化ブロックに属し、 を初期化しているため、 this を渡すことにより、メイン スレッドは の初期化ブロックを実行します。Runnablemain()ThreadRunnableBenchmark

メインスレッドtimerNameの値を取得します

以下のようなメソッドgetName()から呼び出すrun()

@Override
public void run() {
    start = System.currentTimeMillis();
    System.err.println("\nStarted timer " + Thread.currentThread().getName());
}
于 2013-07-06T18:06:22.280 に答える
2

スレッドにアクセスできる名前を付けるにはどうすればよいですか (worktimer)?

timer.getName()

Benchmark() ではなく Thread の finish() メソッドにアクセスするにはどうすればよいですか?

finish()ための方法はありませんThread

于 2013-07-06T18:06:29.397 に答える
1

実際の問題は

String timerName = Thread.currentThread().getName();

インスタンス化時にタイマー名を設定し、mainこのランナブルをインスタンス化するスレッドです

Benchmark bmark = new Benchmark(); // currentThread() is main here

したがって、問題を解決するには、自分自身のcurrentThread()内部を特定しますrun()

@Override
public void run() {
    start = System.currentTimeMillis();
    System.err.println("\nStarted timer " + Thread.currentThread().getName());
}

また、常にmain呼び出すのはスレッドであるため、

bmark.finish();

常に印刷されますmain

于 2013-07-06T18:07:38.163 に答える