Java 如何命名线程?
我编写了一个小的示例程序来帮助自己理解线程。我有两个类文件,如下所示: DoBench.java:Java 如何命名线程?,java,multithreading,Java,Multithreading,我编写了一个小的示例程序来帮助自己理解线程。我有两个类文件,如下所示: 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'
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);
}
}
}
输出为:
Started timer main
0
1
2
3
4
5
6
7
8
9
main took 0ms
我有两个问题
调用
getName()
的上下文是错误的
String timerName = Thread.currentThread().getName();
原因:当执行上述代码时,上下文中的线程将是主线程。由于上述代码属于Runnable
实现的初始化块,并且在main()
中您正在初始化线程
,因此通过传递此Runnable
,主线程执行基准
的初始化块
因此timerName
获取主线程的值
从run()
方法调用getName()
,如下所示
@Override
public void run() {
start = System.currentTimeMillis();
System.err.println("\nStarted timer " + Thread.currentThread().getName());
}
调用getName()
的上下文是错误的
String timerName = Thread.currentThread().getName();
原因:当执行上述代码时,上下文中的线程将是主线程。由于上述代码属于Runnable
实现的初始化块,并且在main()
中您正在初始化线程
,因此通过传递此Runnable
,主线程执行基准
的初始化块
因此timerName
获取主线程的值
从run()
方法调用getName()
,如下所示
@Override
public void run() {
start = System.currentTimeMillis();
System.err.println("\nStarted timer " + Thread.currentThread().getName());
}
如何给线程一个它可以访问的名称(worktimer)
如何访问线程的finish()方法,而不是Benchmark()方法
对于线程
如何给线程一个它可以访问的名称(worktimer)
如何访问线程的finish()方法,而不是Benchmark()方法
对于线程没有方法finish()
,实际问题是
String timerName = Thread.currentThread().getName();
它在实例化时设置计时器名称,它是实例化此可运行时间的main
线程
Benchmark bmark = new Benchmark(); // currentThread() is main here
因此,要解决此问题,请在run()
本身中标识您的currentThread()
@Override
public void run() {
start = System.currentTimeMillis();
System.err.println("\nStarted timer " + Thread.currentThread().getName());
}
另外,请注意,由于调用
bmark.finish();
它将始终打印main
实际问题是
String timerName = Thread.currentThread().getName();
它在实例化时设置计时器名称,它是实例化此可运行时间的main
线程
Benchmark bmark = new Benchmark(); // currentThread() is main here
因此,要解决此问题,请在run()
本身中标识您的currentThread()
@Override
public void run() {
start = System.currentTimeMillis();
System.err.println("\nStarted timer " + Thread.currentThread().getName());
}
另外,请注意,由于调用
bmark.finish();
它将始终打印main