IBMのJavaマルチスレッド - 1スレッドの基礎

このチュートリアルでは何ですか? (3)1ページ

このチュートリアルでは、スレッドの基本を探る - 何を、なぜ、どのようにスレッドを使用した簡単なプログラムを書くための便利なスレッドを開始するためにスレッドを。

また、スレッドを使用して、アプリケーションの基本的なビルディングブロックをより複雑に検討する - スレッド、スレッド、そしてどのようにスレッドが相互に通信する方法を制御するとの間でデータをやり取りする方法。

私はこのチュートリアルを取るべきでしょうか? (3)ページ2

このチュートリアルでは、Java言語の幅広い知識を持っていますが、マルチスレッド同時実行または多くはないが、Javaプログラマを経験したためです。

このチュートリアルを読んだ後、あなたは、スレッドを使用した簡単なプログラムを書くことができるはずです。また、スレッドを使用するプログラムの最も簡単な方法を読んで理解する必要があります。


著者について
(3)ページ3

ブライアン・ゲッツは、developerWorksの Java technologyゾーンには、彼が過去15年間、プロのソフトウェア開発されている通常のコラムニストです。彼はあるQuiotixカリフォルニア州ロスアルトス(ロスアルトス)ソフトウェア開発およびコンサルティング会社であるチーフ顧問、。

人気の業界の出版物では、ブライアン見ることができるの公表や今後の記事を

[email protected]ブライアンにお問い合わせください。

スレッドごとの

-threadの基礎
 1.スレッドとは何ですか?
 2.すべてのJavaプログラムは、スレッド使用しています
 。3.なぜ使用スレッドを?
 UI 4より応答
 マルチプロセッサシステムの使用5.
 6.簡略モデリング
 7非同期またはバックグラウンド処理
 8.シンプル、時には危険な
 9行っていないヘッド
 10例、クロッキングに使用つのスレッドと作業を行うにスレッド
 11まとめ

スレッドで何を?
ページ1(トータル11)


概念のプロセスのほぼすべてのオペレーティングシステムのサポート - 互いに隔離されている方法では、プロセス、スタンドアロンのプログラム。

スレッディングは、複数の活動は、プロセス・ツール内で共存できるようにすることです。最近のほとんどのオペレーティングシステムはスレッドをサポートし、様々な形でのスレッドの概念は、長年にわたって存在しています。Javaは、明示的に主流のプログラミング言語の言語自体内のスレッドを含めることが最初だった、それは、基礎となるオペレーティングシステムツールのスレッドとして見られている必要はありません。

スレッドは時々呼ばれている軽量のプロセスをただ、プロセスのように、スレッドはプログラムで独立している、並列実行パスは、各スレッドは独自のスタック、プログラムカウンタと、独自のローカル変数を持っています。しかしながら、分離のプロセスと比較して、プロセス内のスレッド間の分離の程度が小さくなります。彼らは、ファイルハンドルをメモリを共有し、それぞれの状態の他のプロセスを持っている必要があります。

プロセスは、それが互いの間で同期されません、実行同時に表示される複数のスレッドをサポートすることができます。プロセスで複数のスレッドは、同じ変数やオブジェクトにアクセスできることを意味し、同じメモリアドレス空間を共有し、彼らは同じからオブジェクトを割り当てられたヒープ。それは簡単にスレッド間で情報を共有しますが、あなたは、彼らが同じプロセス内の他のスレッドに干渉しないことを保証するように注意する必要がありますが。

JavaスレッドAPIツールと一見シンプル。しかし、複雑なプログラムを書くためのスレッドの有効利用は非常に簡単ではありません。そこに複数のスレッドが同じメモリ空間内にあり、同じ変数共存を共有するので、あなたは、あなたのスレッドが互いに干渉しないように注意しなければならないからです。

すべてのJavaプログラムは、スレッドを使用しています 2ページ(合計11)


メインスレッド-すべてのJavaプログラムには、少なくとも1件のスレッドがあります。Javaプログラムが起動すると、JVMは、メインスレッドを作成し、スレッドの手順がで呼び出すmain()方法。

例えば、ガベージコレクション、終了スレッドを関連する他のオブジェクトのJVMのハウスキーピングタスクを - JVMはまた、あなたは通常、それらを見ていない、他のスレッドが作成されます。他のツールはまた、AWT(なAbstract Window Toolkitを(抽象ウィンドウイングツールキット))やSwingのUIツールキット、サーブレットコンテナ、アプリケーションサーバー、およびRMI(リモートメソッド呼び出し(リモートメソッド呼び出し))としてスレッドを作成します。

なぜスレッドを使うのか? ページ3(合計11)


Javaプログラムでは多くの理由のためのスレッドを使用しています。あなたはスイング、サーブレット、RMIまたはEnterprise JavaBeansの(EJB)技術を使用している場合、あなたはすでにスレッドを使用していることを認識しない場合があります。

スレッドを使用するためのいくつかの理由は、彼らは助けることができるということです。

  • UIの応答性
  • マルチプロセッサシステムを活用してください
  • 簡体モデリング
  • 非同期またはバックグラウンド処理

その他の応答UI ページ4(合計11)

(例えばAWTやSwingのような)イベント駆動型UIツールキットは、このようなキーストロークやマウスのクリックなどのUIイベントを処理するイベントスレッドを持っています。

UIオブジェクトにイベントリスナーにAWTやSwingのプログラム。(例えば、クリックされるボタンのような)特定のイベントが発生すると、リスナーが通知されます。イベントリスナーは、AWTイベントスレッドで呼び出されます。

イベントリスナーは、このような大規模なドキュメントスペルチェックなど長時間の作業を、実行する場合は、イベントスレッドは、スペルチェックを実行している忙しくなるので、イベントリスナーが完了する前に、あなたは余分なUIイベントを処理することはできません。ユーザーが何をすべきか知っているので、これは、プログラムがフリーズするように見えるになるだろう。

AWTスレッドが実行された長時間実行中のタスクの排除など、タスクの実行(中に処理UIイベントを継続することができるようにUIを失速回避するために、イベントリスナーは、別のスレッドへの長い作業する必要がありますリクエスト)。

マルチプロセッサシステムを活用してください ページ5(合計11)

それがために使用よりも多くのマルチプロセッサ(MP)システム。彼らは唯一の大規模なデータセンターや科学計算施設で発見された前に。今では多くのローエンドサーバシステム - 、さらにいくつかのデスクトップシステムは、 - 複数のプロセッサを持っています。

Linuxでは、SolarisおよびWindowsのNT / 2000などの近代的なオペレーティングシステムでは、使用可能な任意のプロセッサ上で実行するために複数のプロセッサとスケジュールのスレッドを利用することができます。

スケジューリングの基本単位は、一般的に、スレッドであり、プログラムは一つだけアクティブなスレッドを持っている場合、それは、単一のプロセッサ上で実行することができます。プログラムは、複数のアクティブなスレッドを持っている場合、それは同時に複数のスレッドをスケジュールすることができます。うまく設計されたプログラムで、複数のスレッドを使用するプログラムは、スループットと性能を向上させることができます。

簡体モデリング 6ページ(合計11)


いくつかのケースでは、スレッドを使用すると、書き込み、維持するために簡単にプログラムを作ることができます。あなたが複数のエンティティ間の相互作用をシミュレートするシミュレーションアプリケーションを、考えてみましょう。各エンティティに独自のスレッドを与えることはシミュレーションとモデリングアプリケーションの多くが大幅に簡素化されていることを確認することができます。

別のスレッドの別の適切な例は、アプリケーションのプロセスは、複数の独立したイベント駆動型時間を有する単純化することです。例えば、アプリケーションは、秒のカウントダウンイベントの特定の番号の後の画面表示を更新するコンポーネントを有するかもしれません。代わりに、定期的にスレッドが何もしませんしましょう、表示時間をチェックし、更新するメインループをさせるのではなく、一定期間後まで休止状態となっている、よりシンプルかつより少ないエラーが発生しやすくなる、画面上のカウンタを更新。このように、メインスレッドは、タイマーを心配する必要はありません。

非同期またはバックグラウンド処理 7ページ(合計11)


サーバーアプリケーションは、(ソケットなど)リモートソースから入力を受けます。ソケットを読み取るときにデータがない現在利用可能な場合は、その後、SocketInputStream.read()利用可能なデータは今のところがあるまで呼び出しがブロックされます。

ソケットから読み取られるシングルスレッドプログラム、およびソケットエンティティのもう一方の端は、任意のデータを送信しない場合は、プログラムは単に永遠に待つことなく、他の処理でしょう。代わりに、プログラムが利用可能なデータがあるかどうかを確認するためにソケットをポーリングすることができますが、通常はパフォーマンスの影響ので、このアプローチを使用しないでください。

あなたがソケットから読み込むためのスレッドを作成した場合、スレッドは、入力ソケットを待っているときしかし、その後、メインスレッドは、他のタスクを実行することができます。あなたも、複数のスレッドを作成することができますので、あなたは、同時に複数のソケットを読み取ることができます。利用可能なデータがある場合には常に利用可能なデータを確認するためにポーリングすることなく、(スレッドが起こされるのを待っているので)このように、あなたはすぐに通知されます。スレッドが待機ソケットポーリングコードも少ないエラーが発生しやすい、より単純である使用してください。

シンプル、時にはリスクがあります 8ページ(全11)


Javaスレッドツールは非常に使いやすいが、あなたは、マルチスレッド・アプリケーションを作成するとき、あなたはリスクの一部を回避しようとする必要がありますが、。

複数のスレッドが同じデータ項目にアクセスすると(静的なフィールドとして、グローバルにアクセス可能なインスタンスフィールドまたはオブジェクトのコレクションを共有することができます)、彼らはデータの一貫したビューを見ることができるように、データへの協調のアクセスを確保する必要がありますが、お互いにありません変更は、他に干渉する。この目的を達成するために、Java言語には、二つのキーワードが用意されていますsynchronizedvolatile私たちは、後でこのチュートリアルではこれらのキーワードの使用と意味を検討します。

複数のスレッドから変数にアクセスする場合、同期アクセスの適正な実施を確保する必要があります。単純な変数のために、と宣言した変数はvolatile十分かもしれないが、ほとんどの場合、同期を使用する必要があります。

あなたが共有変数へのアクセスを保護するために、同期を使用しようとしている場合は、プログラムであることを確認する必要があり、すべてのためのローカル変数の同期を使用してアクセスされています。

無理をしないでください 9ページ(合計11)


スレッドが大幅に多くの種類のアプリケーションを簡素化することができますが、スレッドの乱用は、プログラムのパフォーマンスや保守性を危険にさらす可能性があります。スレッドはリソースを消費します。したがって、性能を犠牲にすることなく、作成できるスレッドの数は限られています。

特にシングルプロセッサシステムでは、複数のスレッドを使用していないプログラムの実行速度の主要な消費CPUリソースを引き起こします。


例:タイミングのためのスレッドを使用して作業を完了するために別のスレッドを使用します ページ10(トータル11)


次の例では、2つのスレッド、カウント用と実際の作業のために1つを使用します。メインスレッドは、非常に単純なアルゴリズムを使用して素数を計算します。

在它启动之前,它创建并启动一个计时器线程,这个线程会休眠十秒钟,然后设置一个主线程要检查的标志。十秒钟之后,主线程将停止。请注意,共享标志被声明成 volatile


/**
 * CalculatePrimes -- calculate as many primes as we can in ten seconds 
 */ 

public class CalculatePrimes extends Thread {

    public static final int MAX_PRIMES = 1000000;
    public static final int TEN_SECONDS = 10000;

    public volatile boolean finished = false;

    public void run() {
        int[] primes = new int[MAX_PRIMES];
        int count = 0;

        for (int i=2; count<MAX_PRIMES; i++) {

            // Check to see if the timer has expired
            if (finished) {
                break;
            }

            boolean prime = true;
            for (int j=0; j<count; j++) {
                if (i % primes[j] == 0) {
                    prime = false;
                    break;
                }
            }

            if (prime) {
                primes[count++] = i;
                System.out.println("Found prime: " + i);
            }
        }
    }

    public static void main(String[] args) {
        CalculatePrimes calculator = new CalculatePrimes();
        calculator.start();
        try {
            Thread.sleep(TEN_SECONDS);
        }
        catch (InterruptedException e) {
            // fall through
        }

        calculator.finished = true;
    }
}

小结 第 11 页(共11 页)


Java 语言包含了内置在语言中的功能强大的线程工具。您可以将线程工具用于:

  • 增加 GUI 应用程序的响应速度
  • 利用多处理器系统
  • 当程序有多个独立实体时,简化程序逻辑
  • 在不阻塞整个程序的情况下,执行阻塞 I/O

当使用多个线程时,必须谨慎,遵循在线程之间共享数据的规则,我们将在共享对数据的访问中讨论这些规则。所有这些规则归结为一条基本原则:不要忘了同步


转载于:https://www.cnblogs.com/licheng/archive/2008/09/23/1296800.html

おすすめ

転載: blog.csdn.net/weixin_33938733/article/details/92631570