プロセスは PCB のグループに対応し、PCB はオペレーティング システムのカーネル内でレディ キューとブロッキング キューに分割され、二重リンク リストを使用して管理されることがわかっています。
スレッドには 6 つの状態があります
新規: オペレーティング システムのカーネルはスレッドを作成していません。
終了: スレッドは実行を終了し、破棄されました。
実行可能: スレッドは準備完了状態です: 1. CPU 上ですでに実行中、2. 準備完了キュー内
ブロック済み: これはスリープへの呼び出しです。
待機中: wait メソッドが呼び出されます
timed-wait: スレッドがスリープを呼び出します
最初の 3 つの状態はメイン状態であり、後の 3 つの状態はさまざまな理由からブロック状態です。対応するコードは次のとおりです。
public class Demo13 {
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(()->{
System.out.println("thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(thread.getState());//未创建线程的状态
thread.start();//启动线程
Thread.sleep(500);
System.out.println(thread.getState());
thread.join();//调用后结束线程
System.out.println(thread.getState());//线程销毁后的状态
}
}
複数のスレッドを同時に実行するとコードの実行速度が向上しますが、次の理由によりセキュリティ上の問題も発生します。
1. オペレーティングシステムのランダムスケジューリング/プリエンプティブ実行 [この方法についてはどうすることもできません]
2. 複数のスレッドが同じ変数を変更する
解決策: プログラムの設計を調整して上記の状況を解消します。
3. 一部の変更操作 TM はアトミックではありません
解決策: シャックル操作を通じて、一部の非アトミック操作をアトミック操作にパッケージ化できます。
4. メモリの可視性
5. 命令の並べ替え
問題 4 と 5 はすべて、volatile キーワードによって解決されます。