Java Thread


最近のオペレーティングシステムでは、マルチタスク処理がサポートされていないものはありません.
マルチタスク処理とは、2つ以上のタスクを同時に処理することです.
例えば、パソコンで音楽を聴いたり、インターネットでサーフィンをしたりします.
実際には、CPUカーネル数と同じ数のプロセスを同時に処理できるが、より多くのプロセスが存在するため、すべてのプロセスを同時に処理することはできない.
各カーネルは、短い時間で複数のプロセスを交互に処理することによって、同時に動作するように見えます.

マルチスレッド:1つのプロセスで同時に複数のスレッドを実行することを指します。

  • スレッド:作業ユニット.
  • マルチスレッドのメリットとデメリット

  • CPUの利用率を向上させる.
  • リソースをより効率的に使用します.
  • ユーザーの応答能力が向上しました.
  • タスクが分離され、コードがより簡潔になります.
  • Java Thread


    JavaでThreedを実現する方法は2つあります.

  • Runnableインタフェースの実装

  • Threadクラス継承
  • 1.実行可能なインタフェースの実現

    public class MyThread implements Runnable {
    
        @override
        public void run(){
        	//수행코드
        }
        
     }
  • Runnableインタフェースを実装し、他のクラスを継承できます.
  • run()メソッドを超えるとよい.
  • ただしstart()メソッドはないので、実行可能なインタフェースを実現したクラスオブジェクトを作成してThreadを生成する際に、それをコンストラクション関数のパラメータとして渡し、Threadオブジェクトのstart()メソッドを実行する.
    public static void main(String[] args){
    
        Runnable runnable = new MyThread();
        Thread t = new Thread(runnable, "mythread);
     
     }

    2.Threadクラスの実装

    public class MyThread extends Thread {
    
        public void run(){
        	//수행코드
        }
        
    }
        

  • Threadクラスを継承すると、他のクラスは継承できません(複数の継承は許可されません)

  • run()メソッドを直接実現しなければならない.

  • また、Threadクラスを継承する場合は、スレッドクラスのメソッドを直接使用できますが、Runnable実装の場合は、現在のスレッドへの参照を得るために、Threadクラスの静的メソッドcurrentThread()を呼び出す必要があります.
  • ex)
    Thread.currentThread().getName();

    Threadの実行


    スレッドの実行はrun()呼び出しではなくstart()呼び出しであるべきである.
    
    t1.start(); // 쓰레드 t1을 실행 시킨다.
    t2.start(); // 쓰레드 t2를 실행 시킨다.
    

  • start()は呼び出されたからといってすぐに実行するのではなく、まず待機運転状態にあり、次に自分の番になる.

  • 1回の実行が終了したスレッドは再実行できません.
  • MyThread t1 = new Mythread();
    t1.start();
    t1.start(); // 예외 발생
    
    ----
    Thread t2 = new Thread(new Mythread2());
    t2.start();
    t2 = new Thread(new Mythread2());
    t2.start();
    
    上記で定義した方法はrun()です.ただし、実際には、スレッドを動作させるにはstart()を使用する必要があります.run()メソッドを使用して操作を指示すると、スレッドは動作しますか?そうではありません.どちらの方法も同じ仕事をします.ただしrun()メソッドを使用する場合、これはスレッドではなく、クラスに宣言されたメソッドを呼び出すだけです.
    JavaにはCallStackというものがあります.この領域は実際のコマンドを含むメモリであり,個々に取り出して実行する役割を果たす.
    2つの作業を同時に行う場合は、2つ以上のコールスタックが必要です.スレッドの使用とは、JVMが複数の呼び出しスタックを順番に処理し、同時に動作することをユーザーに表示することです.
    すなわちrun()メソッドを使用すると、スレッドではなくmain()の1つのcallスタックしか使用できません.(これはスレッドオブジェクトを呼び出すrunメソッドにすぎません.)
    start()メソッドを呼び出すと、JVMはスレッドに新しい呼び出しスタックを作成し、コンテキスト切り替えでスレッドのように動作させます.
    最終的には、スレッドトランザクションを処理するために新しいcallスタックを作成する必要があるため、start()メソッドを使用する必要があります.
    start()を使用すると、スレッドはタスクを実行するために必要な呼び出しスタックを作成し、run()を呼び出してスタックにrun()を保存できます.

  • mainメソッドはスレッドのstart()を呼び出します.

  • start()は、新しいスレッドを生成し、スレッドを処理するための呼び出しスタックを生成します.

  • 新しく作成した呼び出しスタックでrun()を呼び出し、スレッドが独立した空間で操作を実行します.

  • 2つの呼び出しスタックがあり、スケジューラが指定した順序でスワップして実行されます.
  • Threadの実行制御


    スレッドには5つのステータスがあります.

  • NEW:スレッドが作成され、start()が呼び出されていません.

  • RunNABLE:運転中または実行可能状態

  • BLOCKED:同期ブロックにより一時停止(ロック解除待ち)

  • WAITING,TIME WAITING:実行不可の一時停止状態

  • TERMINTED:スレッド操作が終了しました
  • 参考資料