複数スレッド - スレッド java 使い方



Java-IOバインドスレッド-1:1スレッドモデル (1)

Javaスレッドは内部的にネイティブスレッドにマッピングされます( pthread_create()相当)。

どのJavaスレッドにマップするかは実装依存です。

各pthreadは、カーネル内の別のスレッドにマップされます

これは単なるナンセンスです。

カーネルはスレッドのスケジューリングを担当します。

Javaスレッドがネイティブスレッドである場合は修正してください。

したがって、各JavaスレッドはOSから見えます。

同上の場合は修正してください。

それは特定のCPUコア上で動作します。

必ずしも。

1:1スレッドモデルに従うOSでJavaプロセスが実行されていると仮定します。

CPUコア上でIOを実行するJavaスレッド、

IOで待機しているプロデューサスレッドは、カーネルをコンテキスト処理してJavaプロセスを切り替え、IOが処理できる状態になるまでJavaプロセスを待機状態にしますか?

他の実行可能スレッドがある場合、プロセスは実行可能なままです。

Javaプロセスの他のスレッド(CPUバインド)がCPUタイムスライスを消費する可能性がありません。

いいえ、他のスレッドは実行可能な場合でも実行できます。

これはすべて非常に混乱しており、多くの誤った実装固有の前提に基づいています。

https://src-bin.com

以下のプログラムでは、

//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は、 crawl(root) IO機能を実行crawl(root)複数のスレッドで起動されるIOバインド実行可能タスクです。

Javaスレッドは内部的にネイティブスレッドにマッピングされます( pthread_create()相当)。 各pthreadはカーネル内の別のスレッドにマップされ、カーネルはスレッドのスケジューリングを行います。

したがって、各JavaスレッドはOSから見えます。 それは特定のCPUコア上で動作します。

1:1スレッドモデルに従うOSでJava プロセスが実行されていると仮定します。

CPUコア上でIOを実行するJavaスレッド、

IOで待機しているプロデューサスレッドは、カーネルをコンテキスト処理してJava プロセスを切り替え、IOが処理できる状態になるまでJavaプロセスを待機状態にしますか? Javaプロセスの他のスレッド(CPUバインド)がCPUタイムスライスを消費する可能性がありません。





scheduler