Java-IO綁定線程-1:1線程模型



linux multithreading (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線程模型的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時間片的機會。

不,其他線程仍然可以運行,如果它們是可運行的。

這一切都非常混亂,依賴於一些錯誤的或特定於實現的假設。





scheduler