Thread


Thread?

  • プロセスには複数のスレッドがあります.
  • a lightweight process
  • CPUの基本ユニット
  • プログラムカウンタ、レジスタグループ、スタックもスレッド単位である.(コード、データ、ファイルは共有されています.)
  • MutiThreadingの利点

  • Responsiveness
  • サーバは、クライアントの要求処理をスレッドに渡して処理し、非ブロック方式(スレッド数)でクライアントの要求を受信し続ける.
  • リソース共有:共有リソース(共有データ領域)
  • 経済性:スレッドのコストは、作成/コンテキスト切替プロセスに比べて低くなります.
  • 拡張性:拡張性.並列処理可能
  • Thread in Java

  • JavaはThreadの基礎です.
  • 1.JavaでのThreadの使用

  • Thread 클래스 상속
  • Runnable 인터페이스 구현
  • Lamda 표현식으로 Runnable 인터페이스 구현→public void run()メソッドoverride
  • public class ThreadExample1{
        public static void main(String[] args) {
            // 1. Thread 클래스 상속
            MyThread1 myThread = new MyThread1();
            myThread.start();
            System.out.println("Hello, My Child!");
    
            // 2. Runnable 인터페이스 구현
            Thread thread = new Thread(new MyThread2());
            thread.start();
            System.out.println("Hello, My Runnable Child!");
    
            // 3. Lambda로 Runnable 인터페이스 구현
            Runnable task = () -> {
                try {
                    while (true) {
                        System.out.println("Hello, Lambda Runnable!");
                        Thread.sleep(500);
                    }
                } catch (InterruptedException ie) {
                    System.out.println("I'm interrupted");
                }
            };
            System.out.println("Hello, My Lambda Child!");
        }
    }
    
    class MyThread1 extends Thread{
        public void run() {
            try {
                while (true) {
                    System.out.println("Hello, Thread!");
                    Thread.sleep(500);
                }
            } catch (InterruptedException ie) {
                System.out.println("I'm interrupted");
            }
        }
    }
    
    class MyThread2 implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    System.out.println("Hello, Runnable!");
                    Thread.sleep(500);
                }
            } catch (InterruptedException ie) {
                System.out.println("I'm interrupted");
            }
        }
    }

    OUTPUT(継承1.Threadクラス)

    Hello, My Child!
    Hello, Thread!
    Hello, Thread!
    Hello, Thread!
    Hello, Thread!
    Hello, Thread!
    Hello, Thread!
    勘定科目勘定科目main thread作成MyThread 1→start()→run()
    :start()ポイントではcontextx-switchingは発生していないため、mainthreadのHello, My Child!が最初に出力されます.その後、MyThread 1のHello, Thread!をcontextx-switchingで出力する.

    2.親スレッド待ち:join

  • プロセスにおけるwait概念
  • public class ThreadExample2 {
        public static void main(String[] args) {
            Runnable task = () -> {
                for (int i = 0; i < 5; i++) {
                    System.out.println("Hello, Lambda Runnable!");
                }
            };
    
            Thread thread = new Thread(task);
            thread.start();
            try {
                thread.join(); // 이때 돌고 있는건 main
            } catch (InterruptedException ie) {
                System.out.println("Parent thread is interrupted");
            }
            System.out.println("Hello, My Joined Child!");
        }
    }

    OUTPUT

    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, My Joined Child!
    勘定科目勘定科目main thread作成MyThread 1→start()→run()→join()
    :join()で回転しているメインスレッドが待機状態に入ります.start()のtask threadがすべて実行されるとmainthreadのHello, My Joined Child!が出力されます.

    3.スレッドのタイプ:interrupt

  • stopは、
  • で廃棄されました.
    public class ThreadExample3 {
        public static void main(String[] args) throws InterruptedException {
            Runnable task = () -> {
                try {
                    while (true) {
                        System.out.println("Hello, Lambda Runnable!");
                        Thread.sleep(100);
                    }
                } catch (InterruptedException ie) {
                    System.out.println("I'm interrupted");
                }
            };
    
            Thread thread = new Thread(task);
            thread.start();
            Thread.sleep(500);
            thread.interrupt();
            System.out.println("Hello, My Interrupted Child!");
        }
    }

    OUTPUT

    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    Hello, Lambda Runnable!
    I'm interrupted
    Hello, My Interrupted Child!

    Multithreading in a Muiticore system

  • 同時性(並列処理)改善
  • 4スレッドの場合、
  • シングルコア:時間単位でインターリーブされます.(時間分割=時間共有)
    *interleapping:埋め込み後処理.
  • マルチコア:カーネル数による並列処理.

  • 多目的注意事項

  • Identification Tasks:タスクの分離を学ぶ.
  • 1~50の場合、1~25と26~50を足す→完全並行作業
  • .
  • が起動する場合、1~25回の起動と26~50回の起動は完全並列動作とは言えない
  • .
  • バランス:同じワークロードを割り当てる
  • Data Splitting
  • データ依存性:データの依存性を管理します.たとえば、上記のライブラリでは、各グループの結果をどのグループと比較するかなど、決定する必要があります.
  • テストとデバッグ:
  • 単一スレッド環境よりもテスト/デバッグが困難

    並列処理方法

  • data parallelism
  • task parallelism
  • →単一のコンピューティング環境における大量のコンピューティングやディスクリソースではなく、分散処理環境を最近使用できるようになり、上述した並列処理方法の区別が無意味になる

    Amdahl's Law

  • CPUコアが多すぎて速度を上げることができません.
  • シリアル(シリアル)処理の動作量に応じて、適切なカーネル数が存在する.
  • Reference
    https://www.inflearn.com/course/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B3%B5%EB%A3%A1%EC%B1%85-%EC%A0%84%EA%B3%B5%EA%B0%95%EC%9D%98/dashboard