精华内容
下载资源
问答
  •  * 如何获取线程对象的名称呢?  * public final String getName():获取线程的名称。  * 如何设置线程对象的名称呢?  * public final void setName(String name):设置线程的名称  *   * 针对不是Thread类的...
    package cn.itcast_03;
    
    
    /*
     * 如何获取线程对象的名称呢?
     * public final String getName():获取线程的名称。
     * 如何设置线程对象的名称呢?
     * public final void setName(String name):设置线程的名称
     * 
     * 针对不是Thread类的子类中如何获取线程对象名称呢?
     * public static Thread currentThread():返回当前正在执行的线程对象
     * Thread.currentThread().getName()
     */
    public class MyThreadDemo {
    public static void main(String[] args) {
    // 创建线程对象
    //无参构造+setXxx()
    // MyThread my1 = new MyThread();
    // MyThread my2 = new MyThread();
    // //调用方法设置名称
    // my1.setName("林青霞");
    // my2.setName("刘意");
    // my1.start();
    // my2.start();
    
    //带参构造方法给线程起名字
    // MyThread my1 = new MyThread("林青霞");
    // MyThread my2 = new MyThread("刘意");
    // my1.start();
    // my2.start();
    
    //我要获取main方法所在的线程对象的名称,该怎么办呢?
    //遇到这种情况,Thread类提供了一个很好玩的方法:
    //public static Thread currentThread():返回当前正在执行的线程对象
    System.out.println(Thread.currentThread().getName());
    }
    }
    
    
    /*
    名称为什么是:Thread-? 编号
    
    
    class Thread {
    private char name[];
    
    
    public Thread() {
            init(null, null, "Thread-" + nextThreadNum(), 0);
        }
        
        private void init(ThreadGroup g, Runnable target, String name,
                          long stackSize) {
            init(g, target, name, stackSize, null);
        }
        
         private void init(ThreadGroup g, Runnable target, String name,
                          long stackSize, AccessControlContext acc) {
            //大部分代码被省略了
            this.name = name.toCharArray();
        }
        
        public final void setName(String name) {
            this.name = name.toCharArray();
        }
        
        
        private static int threadInitNumber; //0,1,2
        private static synchronized int nextThreadNum() {
            return threadInitNumber++; //return 0,1
        }
        
        public final String getName() {
            return String.valueOf(name);
        }
    }
    
    
    class MyThread extends Thread {
    public MyThread() {
    super();
    }
    }
    
    
    */

    展开全文
  • I'm using a ThreadPoolExecutor in Java to manage a lot of running threads. I've created my own simple ThreadFactory so I can give the threads better names.The issue is that the name gets set in the Th...

    I'm using a ThreadPoolExecutor in Java to manage a lot of running threads. I've created my own simple ThreadFactory so I can give the threads better names.

    The issue is that the name gets set in the Thread when the thread pool is first created and is not tied to the task that the thread pool is actually running. I understand this... my Runnables and Callables--though they have names--are actually one level of abstraction down from the ThreadPoolExecutor's running threads.

    There have been some other questions on StackOverflow about creating names for ThreadPoolExecutor thread pools. (See How to give name to a callable Thread? and How to name the threads of a thread pool in Java.)

    What I want to know is: does anyone have a good solution for keeping the name of the thread pool thread in sync with the Runnable that it is actually running?

    i.e. If I call Thread.getCurrentThread().getName() I'd like it not to return the name of the top-level thread pool, but rather the name of the Callable/Runnable that the thread is currently running.

    Since this is mainly for debugging and logging purposes, I'm trying to avoid a solution that involves me putting new code into every Runnable that might be submitted to the ThreadPoolExecutor--I'd rather just put some code into the ThreadFactory or wrap the ThreadPoolExecutor itself so that the change is done in one place. If such a solution doesn't exist I probably won't bother since it's not mission critical.

    begin edit To clarify, I know I can put a Thread.currentThread().setName( "my runnable name" ); as the first line of every Runnable's run method, but I'm trying to avoid doing that. I'm being a perfectionist here, and I realize it, so I won't be offended if people want to comment on this question and tell me so. end edit

    My other question, I suppose, is whether people think it's a bad idea to do such a thing. Should I be wary of updating the thread pool name like this?

    Thanks for any suggestions!

    解决方案

    Create a ThreadPoolExecutor that overrides the beforeExecute method.

    private final ThreadPoolExecutor executor = new ThreadPoolExecutor (new ThreadPoolExecutor(10, 10, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue()){

    protected void beforeExecute(Thread t, Runnable r) {

    t.setName(deriveRunnableName(r));

    }

    protected void afterExecute(Runnable r, Throwable t) {

    Thread.currentThread().setName("");

    }

    protected RunnableFuture newTaskFor(final Runnable runnable, V v) {

    return new FutureTask(runnable, v) {

    public String toString() {

    return runnable.toString();

    }

    };

    };

    }

    Not sure how exactly derveRunnableName() would work, maybe toString()?

    Edit: The Thread.currentThread() is in fact the thread being set in beforeExecute which calls the afterExecute. You can reference Thread.currentThread() and then set the name in the afterExecute. This is noted in the javadocs

    /**

    * Method invoked upon completion of execution of the given Runnable.

    * This method is invoked by the thread that executed the task. If

    * non-null, the Throwable is the uncaught RuntimeException

    * or Error that caused execution to terminate abruptly.

    *

    *

    Note: When actions are enclosed in tasks (such as

    * {@link FutureTask}) either explicitly or via methods such as

    * submit, these task objects catch and maintain

    * computational exceptions, and so they do not cause abrupt

    * termination, and the internal exceptions are not

    * passed to this method.

    *

    *

    This implementation does nothing, but may be customized in

    * subclasses. Note: To properly nest multiple overridings, subclasses

    * should generally invoke super.afterExecute at the

    * beginning of this method.

    *

    * @param r the runnable that has completed.

    * @param t the exception that caused termination, or null if

    * execution completed normally.

    */

    protected void afterExecute(Runnable r, Throwable t) { }

    Edit The TPE will wrap the Runnable within a FutureTask, so to support the toString method you could override newTaskFor and create your own wrapped FutureTask.

    展开全文
  • 原标题:多线程开发不得不掌握,设置和获取线程名称及JVM如何运行的欲善编程,多看、多敲、多讨论;动眼、动手、动大脑。1 如何设置和获取线程名称多线程的运行状态是不确定的,在程序开发过程中,想要获取一些使用...

    原标题:多线程开发不得不掌握,设置和获取线程名称及JVM如何运行的

    欲善编程,多看、多敲、多讨论;动眼、动手、动大脑。

    1 如何设置和获取线程名称

    多线程的运行状态是不确定的,在程序开发过程中,想要获取一些使用中的线程进行操作。那么给线程命名就至关重要。给线程命名第一个办法是通过构造方法设置线程的名称,构造方法:public Thread(Runnable target,String name),其中 String name即线程名称;第二种方法setName方法:public final void setName(String name);而获取线程名称的方法是:public final String getName()。接下来我们通过不同的方法来设置并获取线程的名称。

    注意,如果是运行中线程的线程要获取自身名称,方法是在run中使用:Thread.currentThread().getName();

    b08a3f9431fedcc02e180f6f488f7532.png

    2 创建一个ThreadNameDemo类

    先创建一个ThreadNameDemo类,并在里面创建一个MyThread4内部类,MyThread4实现Runnable接口。在run方法中,我们输出当前线程名称,代码如下图。

    eebcd00195cf737596fe3e0da2570feb.png

    3 测试设置和获取线程名称

    线程A通过构造方式的形式线程类的构造方式进行赋值,线程B通过setName方式进行赋值,并都成功通过getName的方法获取到了线程的名称。线程启动之后,在线程内部也成功获取到线程名称。代码及运行结果如下图。

    bae9042070f9da5eb3fc599c18805ee2.png

    4 匿名线程与主线程的名称

    在构造方法中,不设置线程名称,然后启动,并获取线程名称。运行结果,获取到的线程名称是Thread-0。查看Thread源码,在其init初始化方法中,可以找到这么一段代码,"Thread-" + nextThreadNum(),也就是系统会给匿名线程一个默认的名字,从0开始自增。

    直接调用线程的run方法,在线程运行的时候,获取线程名称返回的并不是Thread-0,而是main,说明myThread3.run()方法确实是运行在主线程。运行测试结果如下图。

    460bb5550664957422839311fb01c803.png

    5 JVM运行在哪里

    现在知道主线程名称是main,java程序运行在JVM中,但是java虚拟机是运行在哪里呢?

    每秒钟新建一个线程,并让线程睡60秒。然后把java程序启动两次。启动完之后,我们打开任务管理器,在进行选项卡下,找到Idea进程,然后打开下拉,会发现多了两个Java(TM) Platform SE binary。说明刚才我刚才运行的JVM运行在进程中,并且在性能界面,可以看到线程数一直在增加。

    当最后一个线程关闭,也就是120秒之后,java程序运行结束,JVM关闭后,任务管理器中的Java(TM) Platform SE binary进程也消失了。

    代码及运行结果如下。

    a4a16800d706f3292a4850a80f755bbb.png

    45f917cd333600c55f415308c612c8a6.png

    敬请期待关于线程的更多奥秘。

    6 结束语

    人人都是程序员,感谢您的阅读,欢迎关注。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 法一:通过无参构造+setXxx()给线程起名字 ... 2 3 /* 4 * 5 * Thread类的方法: 6 * public final String getName() 获取线程对象的名称(放在需要被线程执行的代run()方法里面) 7 * pu...

    法一:通过无参构造+setXxx()给线程起名字

     1 package cn.itcast_03;
     2 
     3 /*
     4  * 
     5  * Thread类的方法:
     6  *         public final String getName() 获取线程对象的名称(放在需要被线程执行的代run()方法里面)
     7  *         public final void setName(String name) 设置线程对象的名称
     8  */
     9 public class MyThreadDemo {
    10     public static void main(String[] args) {
    11         // 创建线程对象
    12         // 通过无参构造方法+setXxx()方法线程起名字
    13         MyThread my1 = new MyThread();
    14         MyThread my2 = new MyThread();
    15         // 调用方法设置名称
    16         my1.setName("林青霞");
    17         my2.setName("刘意");
    18         my1.start();
    19         my2.start();
    20     }
    21 }
     1 package cn.itcast_03;
     2 
     3 public class MyThread extends Thread {
     4     // 需要被线程执行的代码
     5     @Override
     6     public void run() {
     7         for (int x = 0; x < 100; x++) {
     8             System.out.println(getName() + ":" + x);
     9         }
    10     }
    11 }

    法二:通过带参构造方法给线程起名字

     1 package cn.itcast_03;
     2 
     3 /*
     4  * 
     5  * Thread类的方法:
     6  *         public final String getName() 获取线程对象的名称(放在需要被线程执行的代run()方法里面)
     7  *         public final void setName(String name) 设置线程对象的名称
     8  */
     9 public class MyThreadDemo {
    10     public static void main(String[] args) {
    11         // 创建线程对象
    12         // 通过带参构造方法给线程起名字
    13         MyThread my1 = new MyThread("林青霞");
    14         MyThread my2 = new MyThread("刘意");
    15         my1.start();
    16         my2.start();
    17     }
    18 }
     1 package cn.itcast_03;
     2 
     3 public class MyThread extends Thread {
     4     public MyThread() {
     5         super();
     6     }
     7 
     8     public MyThread(String name){
     9         super(name);
    10     }
    11     // 需要被线程执行的代码
    12     @Override
    13     public void run() {
    14         for (int x = 0; x < 100; x++) {
    15             System.out.println(getName() + ":" + x);
    16         }
    17     }
    18 }

     

    我的GitHub地址:https://github.com/heizemingjun
    我的博客园地址:http://www.cnblogs.com/chenmingjun
    我的蚂蚁笔记博客地址:http://blog.leanote.com/chenmingjun
    Copyright ©2018 黑泽明军
    【转载文章务必保留出处和署名,谢谢!】
    展开全文
  • 2、获取线程对象的名字 String name = 线程对象.getName(); 3、修改线程对象的名字 线程对象.setName(“名字”); 4、当线程吗,没有设置名字时,线程的名字是这样的规律: Thread-0, Thread-1, Thread-2…
  • Java 实例 - 获取当前线程名称Java 实例以下实例演示了如何通过继承 Thread 类并使用 getName() 方法来获取当前线程名称:TwoThreadGetName.java 文件public class TwoThreadGetName extends Thread {public void ...
  • 如何获取线程对象的名称呢?public final String getName():获取线程的名称。如何设置线程对象的名称呢?public final void setName(String name):设置线程的名称针对不是Thread类的子类中如何获取线程对象名称呢?...
  • package multithreading; /* 如何创建一个线程呢? 创建线程方式一:继承Thread类。 步骤: 1,定义一个类继承Thread类。...可以通过Thread的getName()方法获取线程的名称 Thread-编号(从0开始) ...
  • 初识多线程--python

    2020-12-06 17:06:17
    先了解下如何获取线程名字、活动线程个数、主线程。 #!/usr/bin/python import threading #获取当前线程对象 cur_thread = threading.current_thread() print("cur_thread name:{0}".format(cur_thread.name)) #...
  • Parallel.Forech(集合名字,项名字=>{ Thread.CurrentThread 通过这个可以获取ID 可以获取当前线程 然后用线程集合保存起来,在异常关闭中进行循环销毁线程操作(Thread.Abort()) 中间是自己的一些操作,...
  • /* 三个方法: 1.获取当前线程对象:Thread.current...3.获取线程名字:t.getName(); */ class Test04 { public static void main(String[] args){ //如何获取当前线程对象 Thread t = Thread.currentThread(...
  • 线程编程的过程中发现,每次连接TWIN读卡器(PCSC)获取到的读卡器名不固定,如果连接十个以上的读卡器,就无法确定哪个线程与哪个读卡器对应,有没有什么办法能解决这个问题?或者能否通过读卡器的设备范例ID获取...
  • Java多线程

    2019-08-23 17:55:23
    一、如何理解多线程 1.多线程概念 2.并行和并发 二、多线程的实现方式 1.继承Thread 2.实现Runnable 三、实现Runnable的原理 四、两种实现多线程方式的区别 五、匿名内部类实现线程的两种方式 1.继承Thread...
  • 主要介绍了Python中实现输入超时以及通过变量获取变量的名字,本文给大家分享了解决思路主要是通过多线程法实现,需要的朋友可以参考下
  • 一、如何获取进程的id号和进程的名字. os.getpid() #获取本进程的id号 os.getppid() #获取本进程的父进程的id号 import os from multiprocessing import Process def f1(): print('f1进程的pid',os.getpid...
  • 推荐观看:BATJ面试官最喜欢问的:多线程线程并发面试题详解(volatile+ThreadLocal+Sleep)_哔哩哔哩 (゜-゜)つロ 干杯~-...pidstat (PS: 这名字一听就知道是干嘛的)# pidstat 是属于 sysstat 下的 linu...
  • 另外正所谓"人如其名",很多时候我们查看到系统在运行的线程名字可读性并不是很好,所以我们可以根据此线程的功能来为线程换一个名称在这里主要用到的方法有:getName():获取当前线程的名称setName();设置当...
  • 那么这种数据就是线程的私有数据,尽管名字相同,但是每个 线程访问的都是数据的副本。 二、如何创建私有数据 1、在使用私有数据之前,你首先要创建一个与私有数据相关的键,要来获取对私...
  • /* 三个方法: 1、获取当前线程对象,Thread... 3、获取线程名字,t.getName();*/public class fuck1{ public static void main(String[] args){ //如何获取当前线程对象 Thread t=Thread.currentThread();//t...
  • /* 如何创建一个线程 创建线程方式一:继承Thead类 步骤 1 定义一个类继承Thead类 ...可以通过Thread的getName获取线程的名称 Thread-编号(从0开始) 一创建对象时就有编号 主线程的名字就是main */ class D
  • /* 如何创建一个线程呢? 创建线程方式一:继承Thread类...可以通过Thread的getName获取线程的名称 Thread-编号(从0开始) 主线程的名字就是main。 */ class Demo extends Thread { private String name; Demo(Str.
  • 1) Android中的工作线程获取数据以后如何传递给主线程?  例如:  例如工作线程通过网络下载一张图片,通过主线程将图片更新到页面上。  所有的耗时操作在工作线程,工作线程不能操作UI  2) Android 中主线...
  • 这种数据就是线程的私有数据,尽管名字相同,但是每个线程访问的都是数据的副本。 如何创建私有数据 1、在使用私有数据之前,你首先要创建一个与私有数据相关的键,用来获取对私有数据的访问权限 。 int pthread...
  • 客户端代码 ''' 网络编程: 如何发送和接受数据 网络通讯三要素: 1.ip 地址--计算机在网络的位置 2,协议--说话方式(说话语言)tcp udp 3,端口号--对方拿什么接收数据(拿什么软件来...#获取主机名字 #...
  • ``` 自己学习commns-io jar包的方法 1.先找类 2.看该类如何创建对象,调用方法 3.看方法名,揣测方法用意 ...2)获取文件名字 getName(String filename) 3)判断是不是这个扩展名 isExtension(String filename,Str...
  • 本文档介绍的是如何获取串口原始数据并将原始数据解析成可处理或可展示的数据。 一、串口采集有很多方式: 1)、MFC有一个专门的控件,直接编程采集,一个控件只能采集一个串口,而且串口名字比如是COM20可能就打...
  • 在做storm项目的时候,发现之前的那种判断是否执行...//从实体的名字获取实体的线程集 private ArrayList getExecutorByName( TopologyDetails topology, String ExecutorNames) { ArrayList re = new ArrayL
  • 程序想实现的效果:客户端现在有一个对象“狗”,... * 此时不知道Judge包含哪些方法,是怎么样的路径,甚至名字是否是Judge * 该使用什么方法来处理?反射?工厂模式?感觉都不大能解决 */ } } ```
  • 如何创建一个线程呢? 创建线程方式一:继承Thread类。 步骤: 1,定义一个类继承Thread类。  2,覆盖Thread类中的run方法。...可以通过Thread的getName获取线程的名称 Thread-编号(从0开始) 主线程的名字就...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 129
精华内容 51
关键字:

如何获取线程名字