JavaRush /Java Blog /Random-JA /Java でのマルチスレッド化

Java でのマルチスレッド化

Random-JA グループに公開済み

導入

Java スレッドについて学ぶ前に、近い将来について見てみましょう。履歴書を提出して面接を受けたと想像してください。あなたと数十人の将来の同僚が、大規模なソフトウェア会社で働くよう招待されました。とりわけ、疲れ果てた人事担当者に雇用のための紙の書類を提出する必要があります。
Java のマルチスレッド - 1
プロセスをスピードアップするために、そのポジションへの応募者を 2 つのグループに分け、2 人の人事マネージャー (社内に人事マネージャーがいる場合) に振り分けることができます。その結果、設計作業が並行して行われるため、プロセスがスピードアップします。
Java のマルチスレッド - 2
会社に人事担当者が一人しかいない場合は、何らかの方法で抜け出す必要があります。たとえば、全員を再び 2 つのグループに分け、女の子と男の子に順番にインタビューすることができます。
Java のマルチスレッド - 3
または、別の原則に従って、下のグループには人数が多いため、男の子 1 人に対して女の子 2 人を交互に配置します。
Java のマルチスレッド - 4
作業を編成するこの方法は、マルチスレッドと呼ばれます。疲れ果てた人事担当者は、別のグループに移り、そこから次の従業員を採用します。おそらく11のグループがあり、人事担当者が4人います。この場合、マルチスレッド処理は複数の HR によって並行して実行され、任意のグループの次の人に文書を処理させることができます。

プロセス

この場合のプロセス(process)は書類受付業務の整理となります。組織では、会計、ソフトウェア開発、顧客との会議、倉庫業務など、いくつかのプロセスを区別できます。各プロセスには、施設、プロセスを実行する従業員などのリソースが割り当てられます。これらのプロセスは相互に分離されています。人事担当者は会計データベースにアクセスできず、顧客サービス マネージャーは倉庫を走り回る必要はありません。プロセスが他の人のリソースにアクセスする必要がある場合、メモや共同会議などのプロセス間コミュニケーションを確立する必要があります。

ストリーム

プロセス内の作業はスレッド ( java thread) に編成されます。人事部門にとって、フローとはグループにサービスを提供するための仕事の組織化です。一番最初の図には 1 つのフローがあり、次の 3 つの図には 2 つのフローがあります。プロセス内では、スレッドを並行して実行できます。2 人の人事担当者が、将来の従業員の 2 つ以上のグループを受け入れます。人事担当者とグループの対話、つまりプロセス内のスレッドの処理は、スレッド同期と呼ばれます。1 人の人事担当者による 2 つのグループのデザインの図には、制服 (女の子 - 男の子 - 女の子 - 男の子) と異なる優先順位 (2 人の女の子と 1 人の男の子が交互) の方法が示されています。スレッドは、自分が属するプロセスのリソースにアクセスできます。グループから人事担当者には、申請書のサンプルと書類に記入するためのペンが与えられます。しかし、フローがそれらに共通するものと相互作用する場合、インシデントが発生する可能性があります。人事担当者が列の最後の人の名前を大声で言うように頼んだ場合、2 つのグループの場合、女性の名前を聞くか男性の名前を聞くかは事前にわかりません。このようなデータ アクセスの競合、ブロック、およびそれらを解決する方法は、非常に重要なトピックです。

フロー状態

各スレッドは次のいずれかの状態になります。
  • 作成 ( New) – 人事担当者の列が準備され、人々が整理されています。
  • 開始 ( Runnable) – 人事担当者のキューに並び、処理中です。
  • ブロックされました ( Blocked) – 列の最後尾の男が名前を叫ぼうとしましたが、次のグループの女の子が自分より先にそれをし始めたと聞くと、彼は黙ってしまいました。
  • 完了 ( Terminated) - キュー全体が人事担当者によって完了されており、その必要はありません。
  • Waiting( Waiting) – あるキューが別のキューからのシグナルを待っています。
スレッドの構成とその相互作用は、プロセスを効果的に運用するための基礎となります。

ITの世界に戻りましょう

21 世紀では、マルチスレッドと並列実行が重要になってきています。前世紀の 90 年代以来、マルチタスク オペレーティング システム Windows、MacOS、Linux が家庭用コンピュータにしっかりと定着しました。多くの場合、4 つ以上のコア プロセッサが搭載されています。GPU ビデオ カードの並列ブロック数はすでに 1,000 を超えています。一般的なプログラムは、マルチスレッド (マルチスレッド) を考慮して作成されています。たとえば、Adobe Photoshop、WinRar、Mathematica、最新のゲームなど、グラフィックス、ビデオを処理したり、大量のデータを操作したりするソフトウェアの最新バージョンです。Java マルチスレッドは非常に重要で、人気があり、複雑なトピックです。したがって、JavaRush コースでは、JavaRush をよく理解するためのタスクがたくさんあります。マルチスレッドに関する Java の例は、スレッドの動作を同期させて、この領域の基本的なニュアンスと微妙な点を習得するのに役立ちます。

プロセス

プロセスは、オペレーティング システム (OS) がメモリ、プロセッサ時間/コア、およびその他のリソースを割り当てたプログラムの実行中のインスタンスです。メモリは個別に割り当てられることが重要であり、異なるプロセスのアドレス空間は相互にアクセスできません。プロセス間で通信する必要がある場合は、ファイル、パイプ、その他のプロセス間通信方法を使用して通信できます。

流れ

Java Thread(ストリーム)。他の Java クラスなどとの混同を避けるためにStream、Java スレッドはスレッドとして翻訳されることがよくあります。これらはプロセスに割り当てられたリソースを使用し、プロセスが実行される方法です。メインスレッドはメソッドを実行してmain終了します。プロセスが実行されると、追加のスレッド (子スレッド) が生成されることがあります。同じプロセスのスレッドは相互にデータを交換できます。Java マルチスレッドではデータ同期を考慮する必要があります。忘れないでください。Java では、プロセスは最後のスレッドが終了すると終了します。バックグラウンド タスクの場合、スレッドをデーモン ( ) として開始できますが、通常のタスクとの違いは、プロセスのスレッド daemon以外のすべてが終了すると強制的に終了されることです。daemon

最初のマルチスレッド アプリケーション

スレッドを作成する方法は 6 つ以上あり、JavaRush コースではそれらを詳しく調べます。まず、基本的なものの 1 つを理解しましょう。Threadメソッドには、run()プログラム ロジックを実装するコードを記述する必要がある特別なクラスがあります。スレッドを作成した後、 を呼び出すことでスレッドを開始できますstart()。Java マルチスレッドの例を実装するデモ プログラムを作成してみましょう。
class PeopleQueue extends Thread    {// Наша очередь из сотрудников, наследник класса Thread
    private String[] names;

    PeopleQueue(String... names) {// Конструктор, аргумент- массив имен сотрудников
        this.names = names;
    }

    @Override
    public void run() { // Этот метод будет вызван при старте потока
        for (int i = 0; i < names.length; i++) { // Вывод в цикле с паузой 0.5 сек очередного сотрудника
            System.out.println("Обработаны documentы: " + names[i]);
            try {
                sleep(500); // Задержка в 0.5 сек
            } catch (Exception e) {}
        }
    }
}

public class HR    {// Класс для демонстрации работы потока
    public static void main(String[] args) {
        // Создаем две очереди
        PeopleQueue queue1 = new PeopleQueue("Ivan","Сергей","Николай","Фердинанд","Basil");
        PeopleQueue queue2 = new PeopleQueue("Мария","Людмила","Алиса","Карина","Olga");

        System.out.println("Начали!"); // Сообщение из главного потока программы
        queue1.start();    //Запускаем одну очередь (дочерний поток)
        queue2.start(); //Запускаем вторую (дочерний поток)
    }
}
プログラムを起動しましょう。コンソールには、メインスレッドから出力されたメッセージが表示されます。次に、各子スレッドはqueue1queue2次に処理される従業員に関するメッセージを共通コンソールに出力します。プログラムで可能なオプションの 1 つ:
Начали!
Обработаны documentы: Мария
Обработаны documentы: Ivan
Обработаны documentы: Людмила
Обработаны documentы: Сергей
Обработаны documentы: Алиса
Обработаны documentы: Николай
Обработаны documentы: Карина
Обработаны documentы: Фердинанд
Обработаны documentы: Ольга
Обработаны documentы: Васorй

Process finished with exit code 0
Java におけるマルチスレッドは、複雑かつ多面的なトピックです。並列、マルチタスク、マルチスレッド コンピューティングを使用してコードを作成できるため、最新のマルチコア プロセッサや多数のコンピューターで構成されるクラスター上でタスクを効果的に実装できます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION