【问题标题】:How to name a Thread multiple times and use it in Java如何多次命名一个线程并在Java中使用它
【发布时间】:2016-05-31 06:54:30
【问题描述】:

我有一个类,其中有一个可运行的线程。我同时向这个类发送一个变量不止一次。该类具有 run() 方法并为从另一个类发送的变量启动自己的线程。 在某些进程之后,我需要通过中断来停止线程,但我必须指定我想要停止的线程的名称(例如 MyThread.interrupt() )。问题是,我每次都在类中创建具有相同对象名称的线程。所以我必须每次都以不同的方式命名这个线程对象并用它的名字来停止它。但我不知道如何.. 这是我的代码;

public class KasaThread  {

public static Thread till ;

public static String [] table_list_kasa; 


public  static void get (final String IP,final String MagID){


     till = new Thread () {



            public void run () {


                if(IP != null){


                try{
                    ...
                    ...
                    ...
                    }catch(Exception e} {}

在另一个类中,我用它的名字打断这个线程,比如 (till.interrupt() ).. 但正如我所说,在这个类中创建的每个线程都具有相同的名称(直到)。

如何解决这个问题?

提前致谢。

【问题讨论】:

    标签: java multithreading threadpool declare


    【解决方案1】:

    我认为您可以使用 methods setName(String name)getName() + 一些计数器来解决这个问题。

    【讨论】:

    • Thread 类中没有getName 采用String。我也看不出这是如何解决问题的。是的,它为线程命名,但无法访问它们。
    • 嗯,是的,我的意思是:for(Thread thread: threads){ if (thread.getName().equals("yourName")) thread.interrupt();} 或者只是在其他类中创建一个地图并从那里控制你的线程
    • 是的,我正在这样做。我创建了一个映射,我通过在末尾添加一个数字来更改线程的名称(例如till1,till2)并将线程的名称放入映射中。但是我如何从那里调用它?我需要使用 till2.interrupt(),但我将 till2 变量作为字符串,而不是线程。
    • 无法访问我命名的线程。 Thread.currentThread() 方法返回的线程包括主线程,并且无法停止。我无法获得像till2.interrupt()这样的线程变量,我将它作为字符串。我做错了什么?
    • 好的,我是通过在创建后更改对象名称,然后将其与 Thread.currentThread() 一起使用来实现的,我意识到此方法返回了当时正在运行的特定线程(不是主线程)线)。所以我可以像 Thread.currentThread().interrupt() 一样中断线程。感谢您的所有帮助!
    【解决方案2】:

    对此的解决方案是在另一个类中保存一个 HashMap(或您喜欢的任何其他线程 ID),并使其实现 Runnable,这样您就可以在另一个类中控制您的线程。

    【讨论】:

    • 是的,我正在这样做。我创建了一个映射,我通过在末尾添加一个数字来更改线程的名称(例如till1,till2)并将线程的名称放入映射中。但是我如何从那里调用它?我需要使用 till2.interrupt(),但我将 till2 变量作为字符串,而不是线程。
    • 你会做类似myMap.get(VAR_NAME + "1").interrupt() 的事情,将 VAR_NAME “直到”定义为类中的属性。如果不需要“直到”,您可以将地图更改为整数并仅通过该数字引用它
    • 我不能每次都创建不同名称的线程,而不是在创建后更改它吗?就像 till1 = new Thread(); till2 = new Thread() ...我不能在创建时更改变量名吗?
    • 没有办法。为此,您可以使用 Collection 类(arrayList)并按位置遍历该列表。
    • 好的,我是通过在创建后更改对象名称,然后将其与 Thread.currentThread() 一起使用来实现的,我意识到此方法返回了当时正在运行的特定线程(不是主线程)线)。所以我可以像 Thread.currentThread().interrupt() 一样中断线程。感谢您的所有帮助!
    【解决方案3】:

    您可以将线程放在ArrayListLinkedList 中。如果您确实希望能够通过名称访问它们,则可以使用 Map<String, Thread>

    您想同时停止所有线程吗?如果是这样,您可以为此向该类添加一个stop() 方法。它可能看起来像这样:

    public void stop() {
        for (Thread thread : threads) {
            thread.interrupt()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-07
      • 2014-01-25
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 2017-02-28
      • 1970-01-01
      • 2011-08-10
      • 2015-01-10
      相关资源
      最近更新 更多