Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何命名线程?_Java_Multithreading - Fatal编程技术网

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'

我编写了一个小的示例程序来帮助自己理解线程。我有两个类文件,如下所示:

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);
            }
    }
}
输出为:

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

main took 0ms
我有两个问题

  • 如何给线程一个它可以访问的名称(worktimer)
  • 如何访问线程的finish()方法,而不是Benchmark()方法

  • 调用
    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