首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中停止线程时,是否需要调用join()?

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

Stack Overflow用户
提问于 2018-06-24 21:20:42
回答 1查看 1.1K关注 0票数 1

我有以下5个简单的线程,它们运行一个while循环:

代码语言:javascript
复制
flasherThread = new Thread(new Runnable() {
    @Override
    public void run() {
        while(running.get()) {
            // do network stuff         
        }
    }
});

running被声明为private final AtomicBoolean running;

我有这样的方法:

代码语言:javascript
复制
public void stopFlasherThread() {
    running.set(false);
}

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

主要的问题是我一次有4-5个这样的人。

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

代码语言:javascript
复制
for (int i = 0; i < 5; i++) {
    ThreadArrayList.get(i).stopFlasherThread();
    ThreadArrayList.get(i).join()  // should I do this ?
}

任何帮助都会很好!谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-24 22:48:10

根据关于联接的正式文件的说法:

联接方法允许一个线程等待另一个线程的完成。如果t是线程当前正在执行的线程对象, t.join(); 导致当前线程暂停执行,直到t的线程终止为止。

所以不..。或者不一定,只有当您需要该线程的工作结果才能做一些事情。join不会停止/中断线程,它会等待它完成它的工作。stopFlasherThread将使循环停止。

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

代码语言:javascript
复制
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();

在这里,我定义了一个内联类,它扩展了可赎回接口,并实现了在另一个线程中执行任务的call方法。这将返回变量futureResult (即未来 )中的计算结果。因为executor是一个线程池,所以即使我们这里的任务已经解决了,它仍然可以接受任务。要完成整个线程池循环,可以执行一个executor.shutdownNow()

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51014057

复制
相关文章

相似问题

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