4

我有一个长期运行的任务,由两部分组成。第一部分是密集的 I/O 操作(几乎没有 CPU),第二部分是密集的 CPU 操作。我将有 2 个线程运行此任务,以便一个线程中任务的 CPU 部分绑定到另一个线程运行的此任务的 I/O 部分。换句话说,我想在运行 I/O 操作的thread #1同时运行 CPU 密集型部分,thread #2反之亦然,所以我利用最大的 CPU 和 I/O。

Java中是否有一些针对2个以上线程的通用解决方案?

4

4 回答 4

0

看看 Executors 类:

//Create a thread pool
ExecutorService executorService = Executors.newFixedThreadPool(10);

//Launch a new thread
executorService.execute(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
});

//Try to terminate all the alive threads
executorService.shutdown();

这可能会对您有所帮助: 任务执行和调度

于 2013-09-07T13:31:16.137 回答
0

我不认为这是可能的。线程的调度基本上由操作系统处理。操作系统决定哪个线程在哪个逻辑 CPU 上运行。在应用程序级别上,您只能给 OS 调度程序一些提示,例如优先级,但您不能强制进行某种调度。

通过调用特定于操作系统的 API,可以使用 C 或 C++ 等语言,但在 Java 的抽象层上,您无法强制执行该行为。

于 2013-09-07T13:34:39.933 回答
0

将工作分成 2 个线程是一种人为约束,并且作为任何人为约束,它只能限制并行度。如果两个部分在逻辑上是顺序的(例如 io 工作必须先于 CPU 密集型工作才能提供数据),那么它们应该在同一个线程上按顺序执行。如果你有几个独立的任务,它们应该在不同的线程上执行。如果您有数千个线程并且它们占用太多内存,则可能会出现问题。然后,您必须将工作拆分为任务并在线程池(执行程序服务)上运行这些任务。这是一种更复杂的方法,因为您可能需要协调任务的开始,但没有标准的方法可以这样做。协调小任务的解决方案之一是 Actor 执行模型,但无法事先说明 Actor 模型是否适合您的需求。

于 2013-09-07T14:26:41.427 回答
0

创建一个扩展 Thread 的类。现在创建该类的两个对象,并在两个单独的函数中处理 I/O 和 CPU 部分的逻辑。

于 2013-09-07T13:23:56.053 回答