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

时间:2017-10-24 04:23:01

标签: java linux multithreading io scheduler

在以下程序中,

//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时间片。

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

这只是胡说八道。

  

并且内核负责调度线程。

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

  

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

如果同上,请更正。

  

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

不一定。

  

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

     

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

     

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

没有。如果它有其他可运行的线程,该进程仍然可以运行。

  

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

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

这一切都非常困惑,并且依赖于许多不正确或特定于实现的假设。