当前位置: 首页 > 知识库问答 >
问题:

无法在java中设置线程的名称

燕志学
2023-03-14

我在Java学习线程,有一个这样的小程序。我创建一个线程,并用它来创建另一个线程。但是我不能改变第二个线程的名称。有人能解释为什么会这样吗?此外,Thread.sleep(100)意味着主线程将Hibernate100毫秒是正确的吗?谢谢。

class Thread1 extends Thread{
   public void run() {      
      for(int i=0;i<5;i++){
        System.out.println(getName()+" is running. Time is "+i);
      }
   }
}

public class Program{   
    public static void main(String[] args) throws InterruptedException {        
       Thread t1 = new Thread1();
       t1.setName("Thread 1");
       Thread t2 = new Thread(t1);
       t2.setName("Thread 2");
       t1.start();
       Thread.sleep(100);       
       t2.start();      
    }       
}

该计划的结果如下:

Thread 1 is running. Time is 0
Thread 1 is running. Time is 1
Thread 1 is running. Time is 0
Thread 1 is running. Time is 1

编辑:如果我将getName()更改为Thread。currentThread()。getName()然后一切都按预期工作。它们之间有什么区别?

共有2个答案

长孙嘉
2023-03-14

当我们创建thread对象时,JVM assings是该线程的默认名称。JVM分配的默认线程名称类似于-thread-(int值),例如thread-0、thread-1等。

如果我们想为线程使用自己的名称,而不是使用默认名称,那么我们可以通过将自己的名称作为参数传递来使用thread类的构造函数<代码>类MyThread扩展线程{..MyThread(字符串tname){super(tname);}}。。MyThread th=新的MyThread(“我的线程”)

如果我们想在创建带有某个名称的线程对象后更改线程的名称,那么我们可以使用方法公共最终无效setName(字符串名称)

殳阳飙
2023-03-14
   Thread t1 = new Thread1();
   t1.setName("Thread 1");
   Thread t2 = new Thread(t1);   <--- See this.

您正在将相同的先前创建的线程实例(t1)传递给下一个线程实例(t2)。这就是为什么同样的名字会出现。

这应该是这样的:

   Thread t2 = new Thread1();
   t2.setName("Thread 2");

输出:

Thread 1 is running. Time is 0
Thread 1 is running. Time is 1
Thread 1 is running. Time is 2
Thread 1 is running. Time is 3
Thread 1 is running. Time is 4
Thread 2 is running. Time is 0
Thread 2 is running. Time is 1
Thread 2 is running. Time is 2
Thread 2 is running. Time is 3
Thread 2 is running. Time is 4

此外,Thread.sleep(100)意味着主线程将Hibernate100毫秒是正确的吗?

是的。Thread.sleep(毫秒)以毫秒为单位获取参数。

在创建Thread对象时传递Thread实例。这个新线程将使用传递的实例执行(作为可运行实例)。这就是为什么你得到了Thread1和其中运行的线程是不同的,新创建的线程实例。因此,Thread.currentThread(). getName()将为您提供您设置的名称。

public class Thread implements Runnable {
....
....

/* What will be run. */
private Runnable target;       // <-- Runnable is defined here for the thread.


public Thread(Runnable target) {  //<-- constructor you are calling.
    init(null, target, "Thread-" + nextThreadNum(), 0); //<-- internal init call.
}

private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize) {
    init(g, target, name, stackSize, null);  //<-- internal init call.
}

private void init(ThreadGroup g, Runnable target, String name,
                  long stackSize, AccessControlContext acc) {
.....
.....
this.target = target;     // <-- Set the Runnable for the thread.
.....
}
....
....
}
 类似资料:
  • 问题内容: 有什么办法可以在Linux中设置线程的名称? 我的主要目的是在调试时会有所帮助,并且如果通过例如暴露该名称也很好 问题答案: 将功能与选项一起使用(请参阅docs)。 请注意,旧版本的文档有些令人困惑。他们说 设置调用进程的进程名称 但是由于线程是Linux上的轻量级进程(LWP),因此在这种情况下,一个线程就是一个进程。 您可以使用或使用以下命令查看线程名称: 或在之间的: 或从GD

  • 任何想法/暗示都非常受欢迎;谢了!

  • 问题内容: 我正在尝试从shell脚本调用我的linux可执行文件。在调用此可执行文件之前,我想为LD_LIBRARY_PATH设置特定的值。我的shell脚本如下: Parent.sh(包含2行) Set_env.sh 从Linux控制台手动执行Parent.sh scipt时,将在正确设置LD_LIBRARY_PATH的情况下调用execute.so。但是将其与Java代码集成为: 未为可执行

  • 多线程。在这种模式下,SQLite可以安全地由多个线程使用,前提是在两个或多个线程中不同时使用单个数据库连接。 序列化。在序列化模式下,SQLite可以安全地由多个线程使用,不受限制。

  • 我正在从websphere 8.5迁移到Liberty 8.5。那么我可以用吗?. p12文件,它是我从appsvr01中的websphere安装位置获得的 < li >如果是,那么如何在server.xml(liberty)的标记中使用它 -如果没有,那么我们可以自由地使用IBMJSSE2标准生成自己的密钥库。请解释一下。

  • 问题内容: 我写一个简单的应用程序,它涉及三个线程: ,和。 是 生成* 并馈给的生成器类。 * 消耗了 计算平均值。我的号码已经使用该饲料用。用途吃起来。 问题是:: 如果平均值超过中的1E5 ,我想表示停止产生数字。我有一个在需要被打开。我该如何实现? PS:该代码将永久运行,而无需在控制台上打印任何内容,我至今仍未弄清原因!! 问题答案: 您可以使用并将它传递给两个线程,原子类型是可访问的,