我有这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 ?
}
任何帮助将是巨大的!谢谢
最佳答案
根据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
方法以在另一个线程中执行任务。这将在Future变量futureResult
中返回计算结果。由于执行程序是线程池,因此即使我们的任务已经解决,它也可以继续执行任务。要完成整个线程池循环,您可以执行executor.shutdownNow()
。