在下面的程序中,
//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时间片的机会。
不,其他线程仍然可以运行,如果它们是可运行的。
这一切都非常混乱,依赖于一些错误的或特定于实现的假设。