运行 与 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.
我正在为 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.