我在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()然后一切都按预期工作。它们之间有什么区别?
当我们创建thread对象时,JVM assings是该线程的默认名称。JVM分配的默认线程名称类似于-thread-(int值),例如thread-0、thread-1等。
如果我们想为线程使用自己的名称,而不是使用默认名称,那么我们可以通过将自己的名称作为参数传递来使用thread类的构造函数<代码>类MyThread扩展线程{..MyThread(字符串tname){super(tname);}}。。MyThread th=新的MyThread(“我的线程”)
如果我们想在创建带有某个名称的线程对象后更改线程的名称,那么我们可以使用方法公共最终无效setName(字符串名称)
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:该代码将永久运行,而无需在控制台上打印任何内容,我至今仍未弄清原因!! 问题答案: 您可以使用并将它传递给两个线程,原子类型是可访问的,