java中的自定义线程调度

时间:2013-09-07 09:54:20

标签: java multithreading

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

在Java中是否存在超过2个线程的通用解决方案?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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();

这可能对您有所帮助: Task Execution and Scheduling

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

在2个线程中分割工作是一种人为约束,并且作为任何artifacal约束,它只能限制并行度。如果两个部分在逻辑上是顺序的(例如,工作必须在cpu密集型工作之前才能提供数据),那么它们应该在同一个线程上顺序执行。如果你有几个独立的任务,它们应该在不同的线程上执行。如果你有数千个线程并且他们吃了太多内存,可能会出现问题。然后,您必须在任务中拆分工作并在线程池(执行程序服务)上运行该任务。这是一种更复杂的方法,因为您可能需要协调任务的启动,但没有标准方法可以这样做。协调小任务的解决方案之一是演员执行模型,但事先不能说演员模型是否符合您的需求。