当初から、組み込みのJava言語は、同期間中に他の言語に比べて明らかな利点を持っていますマルチスレッドのサポートのjavaの賢明な選択の誕生。最小単位Caozuoxitongスレッドスケジューリング、同時に実行する複数のスレッド、大幅に性能を向上し、マルチコア環境においてより明らかです。しかし、あまりにも多くのスレッドを作成すると、スレッドの不始末は、問題を引き起こす可能性があります。この章では、通信の異なる手段との間の単純なスレッドプールの例および用途により記載シリーズ(単純なWebサーバー)への最終章をスレッドにスレッドを開始するから、Javaの並行プログラミングの基礎に焦点を当てています。
1.はじめスレッド
1.1スレッドとは何ですか
現代のオペレーティングシステムプロセスを作成するプログラムを実行するとき。たとえば、Javaプログラムを起動し、オペレーティング・システムは、Javaプロセスを作成します。今、最小単位はまた、軽量プロセス(ライトウェイトプロセス)として知られているオペレーティングシステムのスレッドスケジューリング、である、あなたがプロセスで複数のスレッドを作成することができ、これらのスレッドは、それぞれのカウンタ、スタックとローカル変数の性質を持っており、アクセスすることができます共有メモリ変数。高速、これらのスレッドのプロセッサを切り替えるユーザーが同時にこれらのスレッドを感じることができます。
Javaプログラムの実行はmain()メソッドから始まり、そして確立コード・ロジックの実行に応じて、関連する他のスレッドを持っていないように見えたが、main()メソッドの実装は名前がメインですので、実際にはJavaプログラムは、本質的にマルチスレッドプログラムでありますJavaプログラムが含まれている一般的なスレッドを表示するには、以下のJMXを使用してスレッド、
パブリック 静的 ボイドメイン(文字列[]引数){ // Javaスレッド管理のMXBean ThreadMXBean = ThreadMXBean ManagementFactory.getThreadMXBean(); // モニタと同期スレッドの同期情報を取得し、スタック情報取得に通す必要はありません threadInfos [] ThreadInfoにthreadMXBean.dumpAllThreads =(偽、偽に) のために(ThreadInfoにThreadInfoに:threadInfos){ 。システムOUT .println(" [ " + threadInfo.getThreadId()+ " ] " + threadInfo.getThreadName()); } } // JDWPコマンドリーダー[7] // JDWPイベントヘルパースレッド[6] // リスナーJDWP交通[5]:dt_socketという // 信号分配処理スレッドは、ディスパッチャ信号JVMに送信される[4] // ファイナライザコールオブジェクトファイナライズの方法[3]スレッド // [2]ハンドラリファレンス明確な基準スレッド // [1]主メインスレッド、ユーザプログラムエントリ
操作の実行Javaプログラム()メソッドが、同時に実行されるメインスレッドと他のいくつかのスレッドに直面していないだけで見ることができます。
1.2なぜマルチスレッドを使用します
簡単な「こんにちは言葉を!」を実行し、非常に多くのスレッドを「気にしない」立ち上げた、複雑で、単純な問題ではないのですか?もちろん、マルチスレッドの使用の真の、常にマルチスレッドの主な理由を使用して開発者に大きなメリットをもたらすことができるためには、次されているわけではありません。
1.複数のプロセッサ・コア
プロセッサのコアのより多くの数だけでなく、ハイパースレッディング・テクノロジーの広範な使用、並列コンピューティングでは、これまで良い今よりもっとほとんどのコンピュータ、およびプロセッサの性能を強化する方法として、だけでなく、高い周波数からより多くのマルチコア開発。どのように良いコアプロセッサを使用するには、今の主な問題となっています
スレッドは、一度に1つのスレッドが唯一のプロセッサコア上で実行することができ、プログラムは複数のスレッドを作成するために実行されている、プロセスとして実行するためのプログラムを予定し、最もCaozuojitongの基本単位です。シングルスレッドプログラムのみつのプロセッサコアを使用して実行されている想像し、プロセッサコアのない量が著しくプログラムの実装効率を向上させるために添加することはできません。逆に、変更手順はマルチスレッドを使用している場合、複数のプロセッサコアに割り当てる演算ロジックは、著しくプログラムの処理時間を短縮し、より多くのプロセッサが追加されると、コアは、より効率的になります。
2.より速い応答時間
何か私たちは(このコードは複雑なアルゴリズムの複雑さが、複雑なビジネスロジックと言っているわけではない)、より複雑なコードの一部を書きます。たとえば、注文のスナップショットを生成し、彼が挿入注文を含み、順序を作成し、バイヤーなどの記録品の販売などを知らせるために電子メールを送信。開始するには、「注文」ボタンをクリックすると、ユーザから、我々はこれらの操作が正常に購入した製品を完了している参照するのを待つ必要があります。しかし、これほど多くの事業活動は、どのようにそれがそれに高速に完了させることができますか?
上記のシナリオでは、あなたがこのような順序のスナップショットを生成するものとして、(あなたはまた、メッセージキューを使用することができます)今後のデータの一貫性は、他のスレッドを配布し操作する強力ではありません、マルチスレッド技術を使用することができ、そうすることのメリットは、単にユーザの要求でメールを送信したいですスレッドは、応答時間を短縮し、ユーザーエクスペリエンスを向上させることが可能な限り処理することができます。
3.より良いプログラミングモデル
Javaはマルチスレッド、エレガントかつ一貫したプログラミングモデルのための優れたモデルを提供し、開発者はよりどのように多くを考慮することはなく、自分の脳よりも、適切なモデルの確立に遭遇した問題を、問題の解決に集中することができますスレッド。開発者が確立したら少し変更し良いモデルは、常に容易に提供するJavaのマルチスレッドプログラミングモデルにマッピングされたことができます。
1.3スレッドの優先順位
1.4スレッドの状態
1.5デーモンスレッド
2.スレッドを起動および停止
2.1建設スレッド
2.2スレッドを開始
2.3中断理解
2.4は、)(一時停止期限切れ()を再開し、(停止)
2.5終了セキュリティスレッド
3.スレッド間通信
3.1揮発性およびsynchronizedキーワード
3.2待機/通知メカニズム
3.3古典的なケースを通知/待機
3.4パイプライン入力/出力ストリーム
3.5 Thread.jion()
3.6 ThreadLocalの使用
4.スレッド・アプリケーションの例
4.1タイムアウト待ちのモード
4.2単純な例示的なデータベース接続プール
4.3スレッディング・テクノロジーとその例
シンプルなWebサーバ技術に基づいて4.4スレッドプール
5.まとめ