[高同時実行]Java高同時プログラミングシリーズ開山編--スレッド実装

6423 ワード

Javaは最も早く合併した言語の一つであり、過去の伝統的なマルチタスクのモデルでは、より複雑な問題を解決するのは難しいことが分かった.この時、私たちは合併した.
       マルチスレッドはマルチタスクよりも課題があります.マルチスレッドは同じプログラム内で並列に実行されるため、同じメモリ領域に対して同時読み書き操作が行われます.これは、単一スレッドプログラムでは発生しない問題かもしれません.これらのエラーのいくつかは、2つのスレッドが実際に並列に実行されないため、単一CPUマシン上で発生するとは限らない.しかしながら、より現代的なコンピュータは、マルチコアCPUの出現に伴い、異なるスレッドが異なるCPUコアによって真の意味で並列に実行されることを意味する.
       では、Java同時実行の道を始めるにはjavaスレッドから始めましょう.       このページは本シリーズのブログの開山編、つまり基礎スレッドの復習になります.
スレッドの概要
スレッド百科事典
      ,          (Lightweight Process,LWP),           。          ID,      (PC),          。  ,           ,                ,           ,                 ,                           。

スレッドの利点
リソースの使用率が向上プログラム設計が容易になる場合があります.プログラムの応答が高速になる場合があります.
スレッドのコスト
より複雑なコンテキスト切り替えを設計するコストの上昇により、リソース消費量が増加
スレッドの実装
       スレッドには実装方法があり、生産環境で使われているものも異なります.では、まずDemoで実装方法の違いを見てみましょう.
Threadによるスレッド
public class Demo1 {
    public static void main(String args[]) {
        Thread thread = Thread.currentThread();
        System.out.println("    :" + thread);

        thread.setName("hyh thread");//      

        System.out.println("      :" + thread);

        try {
            for (int a = 5; a > 0; a--) {
                System.out.println(a);

                thread.sleep(1000);
            }
        } catch (Exception e) {
            System.out.println("    ");
        }
    }

Runnableインタフェースの統合による実装
Demo 2.classリスト:
public class Demo2 implements Runnable {

    Thread t;

    //     
    Demo2() {
        t = new Thread(this, "    ");
        System.out.println("   " + t);
        t.start();
    }

    public void run() {
        try {
            for (int a = 5; a > 0; a--) {
                System.out.println("   " + a);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("  ");
        }
        System.out.println("     ");
    }
}

/**
 *   
 */
class ThreadDemo {
    public static void main(String args[]) {
        new Demo2();//       
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("   :" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("     ");
        }
        //     
        System.out.println("     ");

    }
}

Thread書き換えrunメソッドを統合することで実現
public class Demo3 extends Thread {
    public Demo3() {
        //     
        super("  Demo");
        System.out.println("   :" + this);
        start();
    }

    @Override
    public void run() {
        try {
            for (int a = 5; a > 0; a--) {
                System.out.println("   :" + a);
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            System.out.println("     ");
        }
    }

}

class MasterThread {
    public static void main(String args[]) {
        new Demo3();//     

        try {
            for (int i = 5; i > 0; i--) {
                System.out.println("   :" + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("     ");
        }
        System.out.println("     ...");
    }
}

3つのスレッドの実装
日常生産では、スレッドを使用してRunnableインタフェースを実現することができます.以下、この方法で簡単な3つのスレッドDemoを実現します.
構造:1つのDemo 4クラス、もう1つのメインクラスMultiThreadDemo.リストを作成します.
 public class Demo4 implements Runnable {
 //    
    String name;
    Thread thread;

    //   
    public Demo4(String th) {
        name = th;
        thread = new Thread(this, name);
        System.out.println("   " + thread);
        //    
        thread.start();
    }

    //  run  
    public void run() {
        try {
            for (int a = 5; a > 0; a--) {
                System.out.println(name + ":" + a);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println("  ");
        }
        System.out.println(name + "    ");
    }
}

/**
 *    
 *
 * @author hyh
 */
class MultThreadDemo {

    public static void main(String[] args) {
        //      
        Demo4 thread_1 = new Demo4("   ");
        Demo4 thread_2 = new Demo4("   ");
        Demo4 thread_3 = new Demo4("   ");
        //    
        System.out.println("     :" + thread_1.thread.isAlive());
        System.out.println("     :" + thread_2.thread.isAlive());
        System.out.println("     :" + thread_3.thread.isAlive());

        try {
            System.out.println("        ");
            //  join         
            thread_1.thread.join();
            thread_2.thread.join();
            thread_3.thread.join();
        } catch (InterruptedException e) {
            System.out.println("    ");

        }
        //    
        System.out.println("   :" + thread_1.thread.isAlive());
        System.out.println("   :" + thread_2.thread.isAlive());
        System.out.println("   :" + thread_3.thread.isAlive());
    }
}

これで、開山Demoは完成しました.本文のソースコードGithubアドレス:https://github.com/hanyahong/com-hanyahong-blog/tree/master/com-hanyahong-thread-1/src/main/java/com/hyh/thread
思考:プロセスとスレッドの比較
プロセスリソース割り当ての基本単位.プロセスに関連するすべてのリソースは、プロセス制御ブロックPCBに記録される.プロセスプロセッサのスケジューリング単位であり、完全な仮想アドレス空間を有する.プロセスがスケジューリングされると、異なるプロセスは異なる仮想アドレス空間を有し、同じプロセス内の異なるスレッドは同じアドレス空間を共有する.スレッドは、リソース割り当てに関係なく、プロセスに属し、他のスレッドとプロセスリソースを共有します.スレッドは、関連スタック(システムスタックまたはユーザスタック)レジスタおよびスレッド制御テーブルTCBのみから構成される.レジスタは、スレッド内のローカル変数を格納するために使用することができるが、他のスレッドの相関変数を格納することはできない.プロセスはマルチスレッドで、プロセスは実行可能なエンティティではありません.
両者の比較:スケジューリングと切り替え:スレッドコンテキスト切り替えはプロセスコンテキスト切り替えよりずっと速い.通信:プロセス間通信IPC、スレッド間で直接プロセスデータセグメント(グローバル変数など)を読み書きして通信することができます.プロセス同期と反発手段の補助が必要で、データの一致性を保証します.アドレス空間と他のリソース(ファイルを開くなど):プロセス間は互いに独立しており、同じプロセスの各スレッド間で共有されています.プロセス内のスレッドは、他のプロセスでは表示されません.
(本編完)WeChat:wixf 150オリジナル記事、転送は出典を明記してください:http://www.cnblogs.com/hyhnet/p/6250264.html 独立したサイトにアクセスして、より良いユーザー体験を得る:http://www.hanyahong.com
転載先:https://www.cnblogs.com/hyhnet/p/6250264.html