在以下程序中,
//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都是mapped到内核中的不同线程,内核负责调度线程。
因此,每个java线程对OS都是可见的。它运行在特定的cpu核心上。
假设java process在跟随1:1线程模型的操作系统上运行。
在cpu核心上执行IO的java线程,
生产者线程在IO上等待触发内核到上下文切换出java process并将java进程置于等待状态,直到IO准备好被处理为止?没有机会让java进程的其他线程(CPU绑定)占用CPU时间片。
答案 0 :(得分:0)
Java线程在内部映射到本机线程(相当于
pthread_create()
)。
Java线程映射到的是与实现相关的。
每个pthread都映射到内核中的不同线程
这只是胡说八道。
并且内核负责调度线程。
如果Java线程是本机线程,则更正。
因此,每个java线程对操作系统都是可见的。
如果同上,请更正。
它在特定的cpu核心上运行。
不一定。
假设java进程在遵循1:1线程模型的OS上运行。
在cpu核心上执行IO的java线程,
IO上的生产者线程是否会触发内核到上下文切换出java进程并将java进程置于等待状态,直到IO准备好被处理为止?
没有。如果它有其他可运行的线程,该进程仍然可以运行。
没有机会让java进程的其他线程(CPU绑定)占用CPU时间片。
不,如果其他线程可以运行,它们仍然可以运行。
这一切都非常困惑,并且依赖于许多不正确或特定于实现的假设。