我写了一个小例子程序来帮助自己理解Threads。我有两个类文件,如下所示:
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
我有两个问题,
答案 0 :(得分:2)
调用getName()
的上下文是错误的。
String timerName = Thread.currentThread().getName();
原因:执行上述代码后,上下文中的Thread
将为主线程。由于上述代码属于Runnable
实现的初始化块,因此在main()
中,您正在通过传递此Thread
初始化Runnable
,主线程执行Benchmark
的初始化块。
所以timerName
获取主线程的值
从getName()
方法拨打run()
,如下所示
@Override
public void run() {
start = System.currentTimeMillis();
System.err.println("\nStarted timer " + Thread.currentThread().getName());
}
答案 1 :(得分:2)
如何为线程提供一个可以访问的名称(worktimer)?
timer.getName()
如何访问Thread的finish()方法,而不是Benchmark()?
finish()
Thread
答案 2 :(得分: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
。