Javaの並行プログラミング2つのノート

Javaスレッド

この方法は、直接スレッド

// 创建线程对象
Thread t = new Thread() {
 public void run() {
 	// 要执行的任务
	 }
};
// 启动线程
t.start();

スレッドのRunnableで使用される第二の方法

[スレッド]と[タスク](実行するコード)を別々に

  • スレッド代表スレッド
  • タスク(コードのスレッドを実行する)Runnableを実行可能
Runnable runnable = new Runnable() {
 public void run(){
 	// 要执行的任务
 }
};
// 创建线程对象
Thread t = new Thread( runnable );
// 启动线程
t.start(); 

原則とのRunnableとの間の関係のスレッド

  • 方法1は、スレッドであり、タスクが併合、方法2は、スレッドとタスクを分離することです
  • Runnable他の上級と簡単かつスレッドプールAPI
  • RunnableThreadクラスの継承のタスクシステムを外に出して、より柔軟に

だから、使用してみてくださいRunnable

方法3、スレッドとFutureTask

パラメータのFutureTask呼び出し可能タイプが受信できる場合には、処理結果を返すことがあります

// 创建任务对象
FutureTask<Integer> task3 = new FutureTask<>(() -> {
 log.debug("hello");
 return 100;
});
// 参数1 是任务对象; 参数2 是线程名字,推荐
new Thread(task3, "t3").start();
// 主线程阻塞,同步等待 task 执行完毕的结果
Integer result = task3.get();
log.debug("结果是:{}", result);

同時に実行する複数のスレッドを守って

  • 交互に行います
  • 後方、我々はコントロールではありません

ビュープロセスのスレッド方法

ウィンドウズ

  • タスクマネージャは、また、プロセスを殺すために使用することができ、プロセスとスレッドを確認することができます
  • tasklist プロセスを見ます
  • taskkill プロセスを強制終了

Linuxの

  • ps -fe すべてのプロセスを見ます
  • ps -fT -p <PID> すべてのスレッドのプロセス(PID)を見ます
  • kill プロセスを強制終了
  • top 大文字Hトグル表示スレッド
  • top -H -p <PID> すべてのスレッドのプロセス(PID)を見ます

ジャワ

  • jps すべてのJavaプロセスを表示するコマンド
  • jstack <PID> Javaプロセス状態の全てのスレッドを見る(PID)の
  • jconsole 操作のプロセス(GUI)でのJavaスレッドを表示します

遠隔監視設定のためにjconsoleを
少し

動作原理スレッド

スタックとスタックフレーム

Java仮想マシンスタック(Java仮想マシン・スタック)
我々はすべて知っていることをスタックメモリは、誰にそれを使用することであるJVMのヒープ、スタック、メソッドエリア、によって?実際には、スレッドは、各スレッド開始後、仮想マシンがスタックメモリが割り当てられます。

  • 各スタックは占有すべてのメソッド呼び出しメモリに対応する、フレーム(フレーム)は、組成物の複数のスタックであります
  • 各スレッドは、現在実行中のメソッドに対応し、一つの活性スタックフレームを有することができます

スレッドコンテキストの切り替え(スレッド・コンテキスト・スイッチ)

以下のCPUのいくつかは、もはや別のスレッドのコードの実行のために現在のスレッドの実行を引き起こさないので

  • スレッドCPUタイムスライスがなくなります
  • ガーベジコレクション
  • 優先度の高いスレッドが実行します
  • 独自のスレッドがスリープ、歩留まり、待ち時間、参加、公園、同期、ロックやその他のメソッドを呼び出します

コンテキストスイッチが発生した場合、現在のスレッドの状態は、オペレーティングシステムによって保存する必要があり、別のスレッドの状態を復元、Javaの対応する概念は、プログラムカウンタ(プログラムカウンタレジスタ)で、その役割は覚えているJVMの下で命令を実行することですアドレスは、スレッドプライベートで

  • 状態は、ローカル変数、オペランドスタック、リターンアドレスとしてプログラムカウンタ、各仮想マシンのスタックフレームのスタック情報を含みます
  • コンテキストスイッチが頻繁に発生し、パフォーマンスに影響を与えます

1、与実行を開始
  • ダイレクトコールがrunメインスレッドで実行されrun、新しいスレッドを開始しません
  • 使用して、start間接的な実行を通じて新しいスレッド、新しいスレッドを開始することでrun、コード
2、睡眠与収量

睡眠

  1. コール睡眠が時限待機状態に実行してから、現在のスレッドを作成します(ブロッキング)
  2. 他のスレッドは、スレッド割り込み割り込みメソッドを使用することができます眠っている、そして睡眠方法はスロー InterruptedException
  3. 睡眠の終了後のスレッドが直ちに実施されない場合があります
  4. TimeUnitでは、読みやすくを取得する代わりに、睡眠のスレッドの睡眠をお勧めします

産出

  1. レディ状態に実行したRunnableから現在のスレッドを生成しますコールは、その後、他のスレッドの実行をスケジュール
  2. 具体的な実装では、オペレーティングシステムのタスクスケジューラに依存しています

スレッドの優先順位

  • スレッドの優先順位は、スレッドの(ヒント)スケジューラのスケジューリング優先順位を求めるプロンプトが表示されますが、それは単なるリマインダーで、スケジューラはそれを無視することができます
  • CPUビジーならば、非常に高い優先度のスレッドは、より多くの時間スライスを取得しますが、CPUのレジャーなり、優先順位はほとんど効果なし
図3に示すように、詳細な方法を結合
4、割り込み詳細な方法
公開された93元の記事 ウォン称賛31 ビュー30000 +

おすすめ

転載: blog.csdn.net/weixin_43866567/article/details/104543464