在具有超时的连接调用之后,Java线程会发生什么

Pat*_*iel 7 java multithreading

在使用超时值调用join并且超时通过后,Java线程处于什么状态.例如,您有以下代码:

Thread thread = new Thread();
thread.start();
thread.join(TIMEOUT);
Run Code Online (Sandbox Code Playgroud)

并且超时传递并且线程没有返回状态是什么?我需要注意什么才能确保我不泄漏线程.我最初的假设是在加入调用之后执行以下操作:

if (thread.isAlive())
{
   thread.interrupt();
   thread = null;
}
Run Code Online (Sandbox Code Playgroud)

检查线程是否仍在运行,如果是,则中断它,然后将其清零以确保它被垃圾收集.

Vet*_*sin 5

Javadoc声明join(time)函数最多会等待很多毫秒才能使线程死掉.实际上,如果超时通过,您的代码将停止阻止并继续.如果你担心在这种情况下'泄漏线程',你可能应该重新设计,这样你就不必加入线程并且可以观察正在运行的线程的状态.此外,在线程上调用中断是坏事.

class MyThread extends Thread {
    private boolean keepRunning = true;
    private String currentStatus = "Not Running";
    public void run() {
        currentStatus = "Executing"
        while(keepRunning)
        {
           try {
               someTask()
               currentStatus = "Done";
           } catch (Exception e) {
               currentStatus = "task failed";
               keepRunning = false;
           }
        }
    }

    public stopThread() {
       keepRunning = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

以上可能是一个更好的例子来处理线程.您不需要显式地将线程设置为null,但是例如,如果您在ArrayList中存储线程,则将其从列表中删除并让Java处理它.