JavaEE-マルチスレッドとは何ですか? (一)

スレッドを知っています

糸とは何ですか

スレッドは、オペレーティング システムが操作のスケジューリングを実行できる最小単位ですこれはプロセスに含まれており、プロセス内の実際の操作単位となります。スレッドとは、プロセス内の単一の連続した制御フローを指します。プロセス内で複数のスレッドを同時に実行でき、各スレッドは異なるタスクを並行して実行します。

なぜスレッドがあるのか

各プロセスには独自のアドレス空間、つまりプロセス空間があります。通常、サーバーは大量のリクエストを同時に受信する必要があり、リクエストごとにプロセスを作成するとシステムのオーバーヘッドが高く、リクエストの応答効率が低下するため、オペレーティング システムはスレッドを導入します。
マルチスレッド同時プログラミングは、マルチプロセスよりも軽量です

  • スレッドの作成はプロセスの作成よりも高速です。
  • スレッドの破棄はプロセスの破棄よりも高速です。
  • スレッドのスケジュール設定は、プロセスのスケジュール設定よりも高速です。

プロセスとスレッドの違い

  • プロセスにはスレッドが含まれており、各プロセスには少なくとも 1 つのスレッド (メイン スレッド) があります。
  • プロセス間でメモリ空間が共有されることはありません同じプロセスのスレッドは同じメモリ空間を共有します
  • プロセスはシステムによるリソース割り当ての最小単位であり、スレッドはシステム スケジューリングの最小単位です。
  • 各プロセス間のリソースは独立しています。プロセスがクラッシュしても、他のプロセスには影響しません。同じプロセスのスレッドは、そのスレッドのリソースを共有します。スレッドがクラッシュすると、プロセスもクラッシュします。安定性が悪く、共有やリソースの競合によるさまざまな問題が発生しやすくなります。

同じプロセス内の複数のスレッドは、仮想アドレス空間、ファイル記述子、信号処理など、プロセス内のすべてのシステム リソースを共有します。
同じプロセス内の複数のスレッドには、独自の呼び出しスタック、独自のレジスタ環境、および独自のスレッド ローカル ストレージがあります。

最初のマルチスレッド プログラム

Java 標準ライブラリには、スレッドを表すことができるクラス Thread が用意されています。

スレッドを作成する 5 つの方法は次のとおりです

最初の書き方

Threadクラスを継承する

public class Thread1 {
    
    
    public static class MyThread extends Thread{
    
    
        @Override
        public void run() {
    
    
          while (true){
    
    
              try {
    
    
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
    
    
                  throw new RuntimeException(e);
              }
              System.out.println("新线程");
          }
        }
    }
    public static void main(String[] args) {
    
    
        MyThread t=new MyThread();
        t.start();
        while (true){
    
    
            System.out.println("Main线程");
            try {
    
    
                Thread.sleep(1000);
            } catch (InterruptedException e) {
    
    
                throw new RuntimeException(e);
            }
        }
    }
}

プログラムの実行結果は以下の通りです

mianメソッドに対応したスレッドとt.startメソッドで作成した新規スレッドは同時に印刷が可能で、
ここに画像の説明を挿入
印刷結果を見るとスレッドのスケジューリングがランダムであることがわかります。

2番目の書き方

Runnableインターフェイスを実装する

class MyThread implements Runnable{
    
    
    @Override
    public void run() {
    
    
        System.out.println("新线程");
    }
}
public class Thread2 {
    
    
    public static void main(String[] args) {
    
    
Thread t=new Thread(new MyThread());
t.start();
        System.out.println("main线程");
    }
}

3番目の書き方

匿名内部クラスを使用して Thread サブクラス オブジェクトを作成する

public class Thread3 {
    
    
    public static void main(String[] args) {
    
    
        Thread t=new Thread(){
    
    
            @Override
            public void run() {
    
    
                System.out.println("新线程");
            }
        };
        t.start();
        System.out.println("main线程");
    }
}

4番目の書き方

匿名の内部クラスが Runnable サブクラス オブジェクトを作成する

public class Thread4 {
    
    
    public static void main(String[] args) {
    
    
        Thread t=new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                System.out.println("新线程");
            }
        });
        t.start();
        System.out.println("main线程");
    }
}

5番目の書き方

ラムダ式は Runnable サブクラス オブジェクトを作成します

public class Thread5 {
    
    
    public static void main(String[] args) {
    
    
        Thread t = new Thread(() -> {
    
    
            System.out.println("新线程");
        });
        t.start();
        System.out.println("main线程");
    }
}

5番目の書き方を推奨します

おすすめ

転載: blog.csdn.net/st200112266/article/details/129771155