マルチスレッドとは何ですか?

目次

プロセス

マルチスレッド化

埋め込む

同時

平行


プロセス

プロセス は、データ セットに対する特定の独立した機能を備えたプログラムの動的実行プロセスです。オペレーティング システムによるリソース割り当てとスケジューリングの独立した単位です。 application プログラムが実行されるキャリア。プロセスは抽象的な概念であり、統一された標準定義は存在しませんでした。プロセスは通常、プログラム、データ収集、プロセス制御ブロックの 3 つの部分で構成されます。

プログラム: は、プロセスによって実行される機能を記述するために使用され、プロセスの実行を制御する一連の命令です。

 

データ収集:プログラムの実行時に必要なデータと作業領域。

 

プロセス制御ブロック: にはプロセスの説明情報と制御情報が含まれており、プロセスの存在を示す唯一の兆候です。

スレッド は、オペレーティング システムが操作のスケジューリングを実行できる最小単位です。スレッドはプロセスに含まれており、プロセス内の実際の操作単位です。プロセスはプログラムの基本的な実行エンティティであり、スレッドのコンテナとして理解できます。

プロセスをレストランに例えると、スレッドは従業員に相当します。レストランが営業していくためには、従業員が働かなければなりません。レストランはリソースと場所を提供するだけで、実際にゲストにサービスを提供するのは従業員です。

たとえば、次のコードを実行します。

実行:レストランが建設され、従業員 myThread が採用されます。従業員の仕事は出力と印刷です。

終了:レストランは閉店し、リソースが解放されました。

public class Demo {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.setName("线程员工");
        myThread.start();
    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println(getName() + "打印了:hello world!");
    }
}

結果:

スレッドの従業員は次のように出力しました: hello world! 

マルチスレッド化

レストランを開きたいのですが、従業員 1 人だけでどうやってレストランを開くことができますか?従業員はフロント、シェフ、ウェイターに分かれており、従業員は同時に異なる業務をこなし、業務を遂行することができます。もちろん、複数の従業員が同じことを行うこともできます。例えば、ウェイターは全員がゲストにサービスを提供するためにここにいて、彼らはゲストにサービスを提供するだけです。しかし、ウェイターはゲストにサービスを提供し、各ウェイターは互いに独立しています。あなたはゲストにサービスし、私は私のゲストにサービスを提供します。ただし、全員が同じレストランで働くため、リソースが共有されます。

マルチスレッド とは、プログラムに複数の実行ストリームが含まれていることを意味します。つまり、1 つのプログラム内で複数の異なるスレッドを同時に実行して、異なるタスクを実行できます。各スレッドには独自のプライベート レジスタ (スタック ポインタ、プログラム カウンタなど) がありますが、コード領域は共有されます。つまり、異なるスレッドが同じメソッドを実行できます。マルチスレッド テクノロジにより、単一のプログラムで並列実行の複数のスレッドを作成し、それぞれのタスクを完了できるため、全体的な処理パフォーマンスが向上します。

マルチスレッドは、プログラム内の複数の命令ストリームの同時実行を可能にするメカニズムです。各命令ストリームはスレッドと呼ばれ、互いに独立しています。スレッドはプロセスに似ていますが、より軽量で、単一のタスクの実行に重点を置いています。マルチスレッドは、特に複数のタスクを同時に完了する必要がある場合に、システムの効率を向上させることができる特殊な形式のマルチタスクです。

端的に言えば、レストランスタッフは協力して業務を遂行しなければなりません。

次のコードでは、スレッド従業員 1 とスレッド従業員 2 の作業が出力および印刷され、別々に実行されます。スレッド従業員 1 が最初に出力印刷を完了するか、スレッド従業員 2 が最初に完了する可能性があります。 2 つのスレッドは比較的独立しているため、結果的には両方とも作業を完了しますが、完了の順序は異なる場合があります。

public class Demo {
    public static void main(String[] args) {
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        myThread1.setName("线程员工1");
        myThread2.setName("线程员工2");
        myThread1.start();
        myThread2.start();
    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        System.out.println(getName() + "打印了:hello world!");
    }
}

結果:

スレッド従業員 1 が出力されました: hello world!
スレッド従業員 2 が出力されました: hello world!

または

スレッド従業員 2 が出力されました: hello world!
スレッド従業員 1 が出力されました: hello world! 

埋め込む

次のコードを実行した結果は次のようになります (マルチスレッドを使用)。

所要時間: 1 ミリ秒
スレッドの従業員が出力した所要時間: 503 ミリ秒

public class Demo {
    public static void main(String[] args) {
        long begin = System.currentTimeMillis();

        MyThread myThread1 = new MyThread();
        myThread1.setName("线程员工");
        myThread1.start();

        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - begin) + "ms");
    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        long begin = System.currentTimeMillis();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long end = System.currentTimeMillis();
        System.out.println(getName() + "打印了耗时:" + (end - begin) + "ms");
    }
}

次のコードを実行した結果は次のようになります (マルチスレッドを使用しない場合)。

スレッドの従業員はかかった時間を出力しました: 503 ミリ秒
かかった時間: 507 ミリ秒

public class Demo {
    public static void main(String[] args) {
        long begin1 = System.currentTimeMillis();

        /*MyThread myThread1 = new MyThread();
        myThread1.setName("线程员工");
        myThread1.start();*/

        long begin = System.currentTimeMillis();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long end = System.currentTimeMillis();
        System.out.println("线程员工" + "打印了耗时:" + (end - begin) + "ms");

        long end1 = System.currentTimeMillis();
        System.out.println("耗时:" + (end1 - begin1) + "ms");
    }
}

class MyThread extends Thread {

    @Override
    public void run() {
        long begin = System.currentTimeMillis();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long end = System.currentTimeMillis();
        System.out.println(getName() + "打印了耗时:" + (end - begin) + "ms");
    }
}

2 つの違いは大きく、マルチスレッドを使用するとタスクの完了を待つ必要がありませんが、マルチスレッドを使用しないとタスクの完了を待つ必要があります。

複数のタスクがある場合、マルチスレッドは必要なく、タスクが 1 つずつ実行されるため、時間がかかります。マルチスレッドを使用すると効率が向上します。

マルチスレッドが並行して実行される

同時

最も単純かつ基本的なレベルでは、同時実行とは、同時に独立して実行される 2 つ以上のアクティビティです。また、歩きながら会話をしたり、左右の手で同時に異なる動作をしたりするなど、私たちの日常生活のいたるところにさまざまな現象が見られます。

平行

マルチスレッド コードに関しては、同時実行性と並列性の意味は大きく重複します。並行性と並列性の違いは非常に小さく、主に焦点と使用目的が異なるためです。どちらの用語も、複数のタスクを同時に実行するための構成可能なハードウェア リソースの使用を指しますが、並列処理ではパフォーマンスが重視されます。並列処理について話すとき、人々は主に、大規模なデータ処理のパフォーマンスを向上させるために構成可能なハードウェア リソースを使用することを懸念し、並行性について話すとき、主に関心の分離や応答性を懸念します。

懸念事項の分離:関連するコードをグループ化し、無関係なコードを分離することで、プログラムの理解とテストが容易になり、欠陥が含まれる可能性が高くなります。

並行性で関心を分離し、並列性でパフォーマンスを向上させます。​ 

おすすめ

転載: blog.csdn.net/qq_74312711/article/details/134965781