在下面的程序中,
//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时间片。
不,如果其他线程可以运行,它们仍然可以运行。
这一切都是非常混乱的,并建立在一些不正确或具体实施的假设之上。