在Java中停止线程时是否需要调用join()?

时间:2018-06-24 21:20:42

标签: java concurrency

我有这5个运行while循环的简单线程:

flasherThread = new Thread(new Runnable() {
    @Override
    public void run() {
        while(running.get()) {
            // do network stuff         
        }
    }
});

running被声明为private final AtomicBoolean running;

我有这种方法:

public void stopFlasherThread() {
    running.set(false);
}

我的问题是通过将标志设置为false来立即停止线程?还是我需要调用flasherThread.join()以确保线程已停止?

主要问题是我一次有4-5个。

所以我有一个循环,例如:

for (int i = 0; i < 5; i++) {
    ThreadArrayList.get(i).stopFlasherThread();
    ThreadArrayList.get(i).join()  // should I do this ?
}

任何帮助都会很棒!谢谢

1 个答案:

答案 0 :(得分:1)

根据official documentation on join

  

join方法允许一个线程等待另一个线程的完成。如果t是当前正在执行其线程的Thread对象,

     

t.join();

     

使当前线程暂停执行,直到t的线程终止。

因此,不是……或不一定,仅当您需要该线程的工作结果来执行某项操作时。 join不会停止/中断线程,它将等待它完成工作。 stopFlasherThread将使循环停止。

我建议您使用ExecutorService在Java上使用线程的方法不同。例如:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<AtomicInteger> futureResult = executor.submit(new Callable<AtomicInteger>() {
    @Override
    public AtomicInteger call() {
        // Here I return a random integer, but you can do your proper calculation
        AtomicInteger atomicInteger = 
            new AtomicInteger(ThreadLocalRandom.current().nextInt());
        System.out.println(Thread.currentThread().getName() + " " + atomicInteger);
        return atomicInteger;
    }
});

// Thread returns result, but continues to execute as it is a single thread pool
try {
    System.out.println(Thread.currentThread().getName() + " " + futureResult.get());
} catch (InterruptedException e) {
    // Handle exception properly
    e.printStackTrace();
} catch (ExecutionException e) {
    // Handle exception properly
    e.printStackTrace();
}

// Stop all threads
executor.shutdownNow();

我在那里定义了一个内联类,该类扩展了Callable接口并实现了call方法以在另一个线程中执行任务。这将在变量futureResult中返回计算结果,该变量为Future。由于执行程序是线程池,因此即使我们的任务已经解决,它也可以继续执行任务。要完成整个线程池循环,您可以执行executor.shutdownNow()