首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按线程名终止java线程

按线程名终止java线程
EN

Stack Overflow用户
提问于 2019-12-13 01:33:27
回答 2查看 76关注 0票数 0

我有一个每15秒运行一次的脚本,它每次都会创建一个新线程。有时这个线程会卡住,阻塞我的程序的同步进程。现在,如果线程被阻塞了20个循环,我想用一个特定的名称杀死这个进程。下面是我的代码:

代码语言:javascript
复制
public void actionPerformed(ActionEvent e) {


        Date dNow = new Date( );
        SimpleDateFormat ft = new SimpleDateFormat ("dd-MM-yyyy HH:mm:ss");
        System.out.println(ft.format(dNow));

        ThreadGroup currentGroup = Thread.currentThread().getThreadGroup();
        int noThreads = currentGroup.activeCount();
        Thread[] lstThreads = new Thread[noThreads];
        currentGroup.enumerate(lstThreads);
        boolean loopthreadfound = false;
        for (int i = 0; i < noThreads; i++){
        try{    
        if (lstThreads[i].getName() == "loopthread"){loopthreadfound = true;}           
        }catch(Exception e1){System.out.println(e1);}
        }

        if (loopthreadfound == false){
            loopthreadcounter = 0;
            //Starten in nieuwe thread
            Thread loopthread = new Thread() {

            public void run() {

                try {
                    checkonoffline();
                    checkDBupdates();
                    } catch (JSONException | SQLException | IOException e1) {
                    System.out.println(e1);
                    }
            }

            };

            loopthread.setName("loopthread");
            loopthread.start();

        }else{

            loopthreadcounter++;
            System.out.println("Loopthread already running...   counter: " + loopthreadcounter);        

            if (loopthreadcounter > 20){

             // HERE I WANT TO KILL THE THREAD "loopthread "

            }
        }

}
EN

回答 2

Stack Overflow用户

发布于 2019-12-13 02:05:30

通常,线程名称不是唯一的。如果您正在将一个String与一个Thread相关联,并且该字符串标识了您要停止的线程,请自己跟踪它,而不是将其视为线程名称。

也就是说,创建一个Map<String, Thread>。稍后,您可以通过"name“从map中获取正确的线程并终止它。

请注意,stop()已弃用。您应该找到正确的方法来终止、中断或终止被阻塞的操作。

票数 0
EN

Stack Overflow用户

发布于 2019-12-13 02:12:13

在java中你不能杀死线程。

因此,让我们退后一步:你有一个问题,你想:我知道!我会杀了这条线..。我该怎么做?

错误的策略。让线程结束的最常见的“外部”方法(如在中,而不是从线程本身的代码内部)就是告诉线程进行自我清理。不管它会不会,那是...在那里你写一些代码,这样它就会发生。

对于您的情况:假设某些I/O操作被卡住了。对于大多数I/O和大多数OSes,您可以中断线程;这会导致发生IOException,从而“解开”任何被卡住的东西。我将向您展示一个示例。我将使用Thread.sleep而不是I/O操作,因为java规范保证了可中断性:

在线程的代码中:

代码语言:javascript
复制
public void run() {
    while (!Thread.interrupted()) {
        doExpensiveOp();
        try {
            // sleep a long time
            Thread.sleep(1000000);
        } catch (InterruptedException e) {
            return;
        }
    }
}

在控制代码中:

代码语言:javascript
复制
Thread x = ... that thread.;
x.interrupt();

中断方法将“提升中断标志”,仅此而已。然而,许多java核心库调用都会与之交互。例如,所有被定义为“抛出InterruptedException”的方法,如果它们在线程中断时处于休眠状态,那么它们将立即退出,如果标志为up,而您调用了其中一个方法,它们根本不会运行,它们会立即退出并返回异常。我们还在while循环中检查标志的状态。所以,如果我们在sleep()操作中,如果你中断上面的线程代码,它肯定会退出。如果线程当前处于开销较大的op部分,则会发生以下三种情况之一:

  1. 这个op完全忽略了它。这当然是可能的;只有声明抛出InterruptedEx的方法才能保证正确地处理它。至少,在op结束的那一刻,你的线程肯定会退出,因为调用InterruptedEx.
  2. This会立即抛出睡眠,op会处理它。例如,通过抛出一个带有文本'interrupted'.
  3. The的IOException,op会做一些奇怪的事情。正如上面的代码片段所示,它只是代码。您可以捕获InterruptedException而不执行任何操作,从而清除该标志,而不是实际结束。interrupt()方法不会强制关闭或停止任何东西,在Thread上也没有任何方法可以用来强制停止它。没有一个内置代码( java.*包中的东西)会做这样的事情;它们总是忽略它,抛出指定要这样做的InterruptedException,或者抛出相关的异常;几乎总是IOException.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59309998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档