运行 与 java.utils.concurrent 并行的编译器

Running a compiler in parallel with java.utils.concurrent

我正在为 Java 中的一种语言制作编译器,我希望它能够并行编译许多文件。

我的 class Compiler.java 具有构造函数 Compiler(String fileName) 和方法 compile() 所以要在我的主目录中编译一个文件,我所做的就是:

Compiler c1 = new Compiler("file1.c");
c1.compile();

我想要做的是一个文件列表(可以说 ["file1.c", "file2.c", "file3.c"] )正在执行 c1.compile(), c2.compile(), c3.compile() 并行(c'i' 是文件 'i' 的编译器)。

我还是Java.util.concurrent的初学者。在 C 中,我只是使用 join 方法分叉或使用 POSIX 线程库。但是在 Java 中,我看到线程池等更多内容。任何帮助将不胜感激。

如果您只需要一个线程,您 没有 在 Java 中使用线程池。*(假设您完全想使用线程 * *) 创建线程的最简单方法如下所示:

    Thread t = new Thread(() -> {
        ...code to be executed in the new thread goes here...
    });
    t.start();
    ...do other stuff concurrently with the new thread...
    try {
        t.join();
    } catch (InterruptedException ex) {
        // If your program doesn't use interrupts then this should
        // never happen. If it happens unexpectedly then, Houston! We
        // have a problem...
        ex.printStackTrace();
    }

* 如果您的程序会创建许多短期线程,您可能想要 使用线程池。线程池的目的,就像任何其他类型的“xxxx 池”一样,是重新使用线程而不是不断地创建和销毁它们。与一些程序想要 运行 in 那些线程的 tasks 的成本相比,创建和销毁线程相对昂贵。

使用线程池的最简单方法如下所示:

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

    final int N_THREADS = ...however many worker threads you think you need...;
    final int PRACTICALLY_FOREVER = 999;

    ExecutorService thread_pool = Executors.newFixedThreadPool(N_THREADS);
    while (...still have work to do...) {
        thread_pool.submit(() -> {
            ...task to be executed by a worker thread goes here...
        });
    }
    thread_pool.shutdown();
    try {
        thread_pool.awaitTermination(PRACTICALLY_FOREVER, TimeUnit.DAYS);
    } catch (InterruptedException ex) {
        // If your program doesn't use interrupts then this should
        // never happen...
        ex.printStackTrace();
    }

** 有些人认为线程是老式的 and/or 低级。 Java 有一个完全不同的并发模型。您可能需要花一些时间了解 parallel streams.