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)IO功能的多个线程上启动。

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

因此,每个java线程对操作系统都是可见的。它在特定的cpu内核上运行。

假设java进程运行在遵循1:1线程模型的操作系统上。


在cpu核心上执行IO的java线程

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

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

Java线程映射到的内容取决于实现。

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

这简直是胡说八道。

并且内核负责调度线程。

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

因此,每个java线程对操作系统都是可见的。

如果同上,请更正。

它在特定的cpu内核上运行。

不一定。

假设java进程运行在遵循1:1线程模型的操作系统上。

在cpu核心上执行IO的java线程

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

否。如果进程有其他可运行的线程,则该进程将保持可运行状态。

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

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

这一切都是非常混乱的,并建立在一些不正确或具体实施的假设之上。

最新更新