如下的code:
public class Thread_getName2 extends Thread {
public void run() {
//System.out.println(getName());
System.out.println(currentThread().getName());
}
public static void main(String[] args) {
Thread_getName2 t = new Thread_getName2();
t.start();
t.run();
}
}
如果调用this.getName(),打印结果如下:
t.start(); // Thread-0
t.run(); // Thread-0
调用currentThread().getName(),打印结果如下:
t.start(); // Thread-0
t.run(); // main
以上哪种结果才是正确的呢?
应该是第二种currentThread().getName()
首先可以理解t.run()方法应该是由主线程调用的,而直接调用getName()时却打印出了Thread-0,这是不正确的。
那为什么getName()会产生这样的结果呢?
首先Thread_getName2 t = new Thread_getName2();
这个时候如果打印下t,会发现t的值为: Thread[Thread-0,5,main],这个可以看Thread类的toString()方法,
ThreadGroup group = getThreadGroup();
// java.lang.ThreadGroup[name=main,maxpri=10]
if (group != null) {
return "Thread[" + getName() + "," + getPriority() + "," +
group.getName() + "]";
}
而以下两种方式是一样的
System.out.println(getName());
System.out.println(this.getName());
而this就是当前的t,所以t.run()也会打印出Thread-0。
通过以上的比较,如果要得到准确的线程的名称,必须要先调用currentThread()得到当前是哪个线程,而后调用getName()才能得出正确的结果。
如果单单只是调用getName()则会产生错误的结果。
分享到:
相关推荐
在这个“currentThread.getName.rar”压缩包中,我们主要探讨的是如何在Java中通过继承`Thread`类以及使用`currentThread().getName()`方法来跟踪和理解线程的状态。 首先,我们来看`Thread`类。在Java中,创建线程...
System.out.println("Current thread name: " + Thread.currentThread().getName()); System.out.println("run() method called"); } } public class Main { public static void main(String[] args) { ...
System.out.println("main(): "+Thread.currentThread().getName() + " is running"); } } } class TestThread extends Thread { public void run() { while(true) { System.out.println("TestThread: "+...
System.out.println("Activity-->"+ Thread.currentThread().getName()); } Runnable r = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread...
System.out.println("主线程:" + Thread.currentThread().getName()); MyThread thread = new MyThread(); thread.start(); } } class MyThread extends Thread { @Override public void run() { System....
ime.now(), Thread.currentThread().getName()); ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1, r -> { Thread t = new Thread(r); t.setName("ScheduledThreadPoolExecutorDemo"); ...
System.out.println("调度进程:" + current.getName() + ",执行时间:" + current.getExecutionTime()); // 模拟执行过程 simulateExecution(current.getExecutionTime()); } } private static void ...
Thread current = Thread.currentThread(); System.out.println("定时任务1:"+current.getId()); logger.info("ScheduledTest.executeFileDownLoadTask 定时任务1:"+current.getId()+ ",name:"+current.getName()...
System.out.println("线程" + Thread.currentThread().getName() + ":" + i); try { sleep((int) (Math.random() * 10)); } catch (InterruptedException e) { e.printStackTrace(); } } System.out....
在上述代码中,`run()`方法内的for循环有两个操作涉及`x`变量:`System.out.println(Thread.currentThread().getName()+" : "+x);`和`x++;`。由于Java的非原子性操作,这两个操作在并发环境下可能不会按预期顺序执行...
StackTraceElement[] sts = Thread.currentThread().getStackTrace(); if (sts == null) { return null; } for (StackTraceElement st : sts) { if (st.isNativeMethod()) { continue; } if (st....
总结,Python的`threading`模块为开发者提供了丰富的多线程编程工具,通过实例化`Thread`类和使用相关方法,我们可以有效地管理和控制线程,实现高效的并发执行。然而,需要注意的是,虽然多线程能提高效率,但也...
System.out.println(Thread.currentThread().getName() + ": " + i); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } try { Thread.sleep(1000); // 确保交替执行 } ...
System.out.println(Thread.currentThread().getName() + ": is run"); } } } class NewThread implements Runnable { int index = 0; @Override public void run() { while (true) { // System.out....
System.out.println("主线程名称:" + Thread.currentThread().getName()); // 创建并启动新线程 Thread newThread = new Thread(() -> { System.out.println("新线程名称:" + Thread.currentThread()....
System.out.println(Thread.currentThread().getName() + "-start"); // 创建并启动子线程 for (int i = 0; i ; i++) { new SubThread(runningThreadNum).start(); } // 等待所有子线程完成 ...
System.out.println(Thread.currentThread().getName() + "-inc:" + j); } private synchronized void dec() { j--; System.out.println(Thread.currentThread().getName() + "-dec:" + j); } class Inc ...
4. **掌握方法中参数传递的方式:** 包括值传递和引用传递的区别。 5. **理解类的继承性:** 学会如何创建子类,继承父类的属性和方法。 6. **掌握类的多态性:** 理解多态的概念,学会使用抽象类和接口实现多态。 ...
使用`Thread.currentThread().getId()`可获取当前线程的唯一ID,而`Thread.currentThread().getName()`则返回线程的名称。这些信息在调试多线程问题时非常有用。 5. **设置线程上下文加载器**: `Thread....
Thread t1 = new Thread(() -> { System.out.println("T1 start"); // T1 执行逻辑 System.out.println("T1 end"); }); Thread t2 = new Thread(() -> { System.out.println("T2 start"); // T2 执行逻辑 ...