如下的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()则会产生错误的结果。
分享到:
相关推荐
通过继承 Thread 类并使用 currentThread.getName() 方法来监测线程的状态
System.out.println("Activity-->"+ Thread.currentThread().getName()); } Runnable r = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread...
StackTraceElement[] sts = Thread.currentThread().getStackTrace(); if (sts == null) { return null; } for (StackTraceElement st : sts) { if (st.isNativeMethod()) { continue; } if (st....
System.out.println(Thread.currentThread().getName()+"-inc:"+j); } private synchronized void dec(){ j--; System.out.println(Thread.currentThread().getName()+"-dec:"+j); } class Inc implements ...
System.out.println(Thread.currentThread().getName()+"-inc:"+j); } private synchronized void dec(){ j--; System.out.println(Thread.currentThread().getName()+"-dec:"+j); } class Inc ...
System.out.println(Thread.currentThread().getName()+"线程出售的是第"+ num-- +"张火车票!"); } } public static void main(String[] args) { SaleTickets s = new SaleTickets(); //:窗口...
System.out.println(“ Jon:” + jobNumber +“正在被线程处理:” + Thread.currentThread()。 getName()); 尝试{Thread.sleep((int)(1000)); } catch(InterruptedException e){} System.out....
1.threading.currentThread:返回当前线程变量 2.threading.enumerate:返回一个包含正在运行的线程的list,正在运行的线程指的是线程启动后,结束前的状态 3.threading.activeCount:返回正在运行的线程数量,效果跟...
TextMessage msg = session.createTextMessage(Thread.currentThread().getName()+ "productor:我是大帅哥,我现在正在生产东西!,count:"+num); System.out.println(Thread.currentThread().getName()+ ...
Runnable runnable = new Runnable() { @Override public void run() { //你要做的事 //…… System.out.println(Thread.currentThread().getName()); handler.postDelayed(runnable, 1000); } }; 然后调用handler....
接收过程 使用和Java / Scala中的React式(非阻塞) Process API。 设置和限制 rx-process继承了... def onNext ( t : String ) = println( s " ### onNext: ' ${t} ' on ${ Thread .currentThread().getName()}
Lambda表达式 1.1 思想 “说重点” 匿名内部类方式来作为线程池执行目标代码 1. 这个方法需要的参数是Runnable接口的实现类对象 ...() -> System.out.println(Thread.currentThread().getName()) La
while(((Thread.currentThread()).getName()).equals("clock")) { now = Calendar.getInstance(); nowTime = now.getTime().getTime(); } while(((Thread.currentThread()).getName()).equals("ti")) while...
private static Logger log = Logger.getLogger(BasicPlayer.class.getName()); /** * These variables are used to distinguish stopped, paused, playing states. * We need them to control Thread. */ // ...
Log.d("waj", "i:"+i+Thread.currentThread().getName()+" "+GameView.this.toString()); int a = (int)Math.ceil(Tools.sharedTools(GameView.this.context).getSetting(GameView.this.level)....
一、线程的学习 线程是程序中执行单个任务的顺序的流程。 线程创建的两种方式: ... System.out.println(Thread.currentThread().getName()); } } }; thread.start(); } 2、实现Runnable接口的
1、问题 通常复杂的处理流程中,我们会使用一些异步处理的手段,那么这种场景下ThreadLocal即可能出现获取失败的问题。... System.out.println(Thread.currentThread().getName()+"-getThreadLocal:
解决多线程当中共享资源冲突的问题 1. 冲突问题展示: /* * 共享资源冲突的问题 */ class SingleThread ... System.out.println(Thread.currentThread().getName() + "售出了第" + ticket + "张票");
System.out.println(Thread.currentThread().getName()); } }); /* 匿名内部类方式来作为线程池执行目标代码 1. 这个方法需要的参数是Runnable接口的实现类对象 2. Runnable接口目标是为了提供一个run 方法, ...