マルチスレッドとは何ですか
スレッドを知っています
糸とは何ですか
スレッドは、オペレーティング システムが操作のスケジューリングを実行できる最小単位です。これはプロセスに含まれており、プロセス内の実際の操作単位となります。スレッドとは、プロセス内の単一の連続した制御フローを指します。プロセス内で複数のスレッドを同時に実行でき、各スレッドは異なるタスクを並行して実行します。
なぜスレッドがあるのか
各プロセスには独自のアドレス空間、つまりプロセス空間があります。通常、サーバーは大量のリクエストを同時に受信する必要があり、リクエストごとにプロセスを作成するとシステムのオーバーヘッドが高く、リクエストの応答効率が低下するため、オペレーティング システムはスレッドを導入します。
マルチスレッド同時プログラミングは、マルチプロセスよりも軽量です。
- スレッドの作成はプロセスの作成よりも高速です。
- スレッドの破棄はプロセスの破棄よりも高速です。
- スレッドのスケジュール設定は、プロセスのスケジュール設定よりも高速です。
プロセスとスレッドの違い
- プロセスにはスレッドが含まれており、各プロセスには少なくとも 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番目の書き方を推奨します