Java – IO绑定线程 – 1:1线程模型

在下面的程序中,

//Producer - IO bound public class FileCrawler implements Runnable{ private final BlockingQueue<File> fileQueue; private final File root; .... public void run(){ try{ crawl(root); // IO bound }catch(InterruptedException e){ Thread.currentThread().interrupt(); } } private void crawl(File root) throws InterruptedException{ File[] entries = root.listFiles(fileFilter); ... for(File entry: entries){ fileQueue.put(entry); } } } 

 //Consumer - CPU bound public class Indexer implements Runnable{ private final BlockingQueue<File> queue; .... public void run(){ try{ while(true){ indexFile(queue.take()); // CPU bound } }catch(InterruptedException e){ Thread.currentThread().interrupt(); } } } 

FileCrawler是IO绑定的可运行任务,在执行crawl(root) IOfunction的多个线程上启动。

Java线程被内部映射到本地线程(相当于pthread_create() )。 每个pthread 映射到内核​​中的不同线程,内核负责调度线程。

所以,每个Java线程都可以被操作系统看到。 它运行在特定的CPU核心上。

假设java 进程在遵循1:1线程模型的OS上运行。


在CPU核上执行IO的Java线程,

生产者线程等待IO触发内核到上下文切换java 进程,并把java进程置于等待状态,直到IO准备好处理? 没有得到java进程的其他线程(CPU绑定)消耗CPU时间片的机会。

Java线程被内部映射到本地线程(相当于pthread_create() )。

Java线程映射到的是实现相关的。

每个pthread映射到内核中的一个不同的线程

这只是无稽之谈。

内核负责调度线程。

如果Java线程是本地线程,请更正。

所以,每个Java线程都可以被操作系统看到。

正确的,如果一样。

它运行在特定的CPU核心上。

不必要。

假设java进程在遵循1:1线程模型的OS上运行。

在CPU核上执行IO的Java线程,

生产者线程等待IO触发内核到上下文切换java进程,并把java进程置于等待状态,直到IO准备好处理?

不可以。如果进程具有其他可运行线程,则进程保持可运行状态。

没有得到java进程的其他线程(CPU绑定)消耗CPU时间片的机会。

不,其他线程仍然可以运行,如果它们是可运行的。

这一切都非常混乱,依赖于一些错误的或特定于实现的假设。