java - 等待执行器服务线程

标签 java multithreading

我有一个类,它使用执行程序服务来同时运行任务。

代码:

class SomeClass{
private static ExecutorService taskThread = Executors.newFixedThreadPool(1, new ThreadFactory() {
        private int threadCount = 0;

        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(r);
            t.setDaemon(true);
            return t;
        }
    });

    static {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                taskThread.shutdown();
            }
        });
    }


doSomeTask()
{
            DocumentUploader callable = new DocumentUploader(randomID,fileLoc);         
            FutureTask<String> task1 = new FutureTask<String>(callable);
            taskThread.execute(task1);
}


someFunctionforWait(){


//what here..???
}

我有另一个类名SomeOtherClass,它将访问由task1线程完成的修改/计算。所以我需要等待线程完成,那么如何才能等待task1完成。我打算做的是从类 SomeOtherClass 调用 someFunctionforWait() 来检查线程是否已完成,然后开始执行其任务。

我该怎么做。

最佳答案

你可以使用Futures,或者如果你想坚持使用ExecutorService,只需等待taskThread.shutdown()和taskThread.awaitTermination();您可以将这些语句放入 someFunctionforWait() 中,然后继续执行。这是一个基于您的代码的简化示例:

public class SomeClass {
    private ExecutorService taskThread = Executors.newFixedThreadPool(1);
    private List<Future<String>> futures = new ArrayList<Future<String>>();
    void doSomeTask() {
        FutureTask<String> task1 = new FutureTask<String>(new Callable<String>() {
            public String call() throws Exception {
                System.out.println("thread executing");
                Thread.sleep(1000);
                return Thread.currentThread().toString();
            }
        });
        taskThread.execute(task1);
        futures.add(task1);
    };

    public void someFunctionforWait() throws InterruptedException, ExecutionException{
        taskThread.shutdown();
        taskThread.awaitTermination(5, TimeUnit.SECONDS);
        System.out.println("joined");
    }

    public void someFunctionforWaitAlternative() throws InterruptedException, ExecutionException{
        for(Future<String> future : futures) {
            System.out.println("future val: " + future.get());
        }
        System.out.println("joined");
    }

    public static void main(String[] args) throws Exception {
        SomeClass c = new SomeClass();
        c.doSomeTask();
        c.someFunctionforWait();
        //c.someFunctionforWaitAlternative();
    }
}

关于java - 等待执行器服务线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25980296/

相关文章:

c++ - 我如何在 C++ 中实现线程关联

c# - .Net 应用程序线程/计时器性能

Python - 属性错误

java - 方法抛出异常未编译,但 RuntimeException 没有问题

java - 如何从 Java 程序执行 Perl 脚本?

python - 带 Spacy 管道的多线程 NLP

JavaFX 流量模拟转换

java - 使用 imageIO 读取 Tiff 图像元数据时出现问题

java - 从具有千位分隔符的字符串中解析数字

java - 如何在 Windows 10 中运行来自 GitHub 的 Java 代码?