Java I/OとNIOネットワークのクリーンアップ2:スレッド


1. 😘 ねじ山


YouTube(プロセス)、MSNチャットツール(プロセス)を開くとマルチプロセスになります.
このプロセスではマルチスレッドも使用できます.

1.プロセス:独自のアドレス空間を持つ独立した実行プログラム


2.スレッド:プロセス内の独立したシーケンスフローまたは制御


特に、Javaは言語レベルでスレッドをサポートする共通言語の1つであり、JVM自体がプロセスであるため、マルチスレッドプログラムを簡単かつ明確に作成することができる.
  • JSP
    JSPはThreedベースなので、処理方式CGI、ASP、PHPよりも簡単です.
    ほとんどのオペレーティングシステムでは、プロセスが他のプロセスのメモリを参照することを許可しないため、パイプまたはIPCが使用されます.これはパフォーマンスに大きな影響を及ぼします.
    しかし,スレッド間ではデータの共有が容易であるため,効率が高い.
  • スレッドは並列に処理できるため、アプリケーションのパフォーマンスと効率を向上させることができます.
    ただし,CPU使用率の高い長時間タスクでは,単一スレッド処理方式が有効である.

    2. 👍 ねじの作成を開始


    1.スレッドのライフサイクル


    -Threadインスタンスの作成
    -startによるインスタンスの実行
    -Runnableオブジェクトrun()を実行する方法
    -runメソッドがすべての処理を完了するとThreadは消失する

    2. white box


    Threedの実装方法では,第1の方法は継承を利用することである.
    Threadクラスを継承するとrunメソッドを超えます.
    class ThreadEx1 extends Thread{
    	public void run(){
         //비즈니스 로직
         }
         
    }
    public class RunnableThreadTest{
    	Thread t = new  ThreadEx1() ;
        t.start
    }
    

    3. black box


    第2の方法は合成を利用することである.
    class ThreadEx2 implements Runnable {
    	public void run(){
         //비즈니스 로직
    }
    public class RunnableThreadTest2{
    	Thread t = new Thread(new RunnableThread());
        t.start();
    }

    4.どちらがいいですか。


    privateとして宣言されていないすべての変数とメソッドジェネレータは、継承をサブクラスに暴露します.
    このように現れるのは、白い箱という意味です.
    スーパークラスが変わると、継承もサブクラスが変わる話題になります.

    スーパーセレブが果物から野菜に変わる例を挙げる。


    機能が増えるにつれて継承関係が複雑になり、修正や拡張ができない場合があります.
    このようなパッケージ性と拡張性を考慮するとblack-box(implements)は非常に有利である.
  • カプセル化とは何ですか?階級をブラックボックス化する.データフィールドはprivateとして宣言され、外部アクセスを阻止し、共通の方法で内部データを制御および変更することをパッケージと呼びます.
  • ただし,合成はオブジェクト間の水平関係であるため,メソッド名が明確でないとコードの可読性が低下するため,クラスを適切にパケットに分離し,インタフェースを設計する必要がある.

    3. 🍤 スレッドを終了


    stop()は様々な問題があるため,SUNマイクロシステムでは方法を使用しないことを提案し,2つの実現方法を実現することができる.

    1.使用フラグ

    while(!stoped){
    
    thread.sleep(500);
    //지연없이 실행하는것은 cpu에 많은 부담을 준다.
    
    //로직
    
    }
    public void stop(){
     stopped = false;
    }
    
    public class StopThreadTest{
    StopThread st = new StopThread();
    Thread thread = new Thread(st);
    thread.start();
    st.stop();
    
    
    フラグは使用できますが、無限ループ回りの問題も発生する可能性があります.

    2.割り込み()メソッドの使用

    class ThreadEx2 implements Runnable {
    	public void run(){
        while(!Thread.currentThread().isInterrupted()){
        
    }catch(InterruptedException e){
    
    }finally{
    //마무리 해야할것
    
    割り込みを使用してスレッドを即座に閉じ、タスクを安全に完了します(DB接続、ソケット閉鎖)
    いいですよ.

    4. 🤳 デーモンスレッドとjoin


    1.デーモンプロセス


    Javaは、アプリケーション内のすべてのスレッドが終了しない限り、JVMを終了しません.
    したがって、バックグラウンドタスクが一般スレッドに設定されている場合、アプリケーションは停止しません.
    そこでjavaはdemons redの概念を導入した.
    class ThreadEx2 implements Runnable {
    	public void run(){
         //비즈니스 로직
    }
    public class RunnableThreadTest2{
    	Thread t = new Thread(new RunnableThread());
        t.setDaemon(true);
        t.start();
        //메인의 실행이 끝나면 쓰레드는 죽는다.
    }

    2.join


    mainスレッドが生成されて実行されるスレッドの終了を待たなければならない場合、どうすればいいですか?
    このときjoin()という関数を使用します.
    A、Bというスレッドがある場合はjoinを使用し、AスレッドがBスレッドを起動すると、Bスレッドが終了するのを待って、残りの作業を続行します.

    5. 🤷‍♀️ スレッド優先度


    複数のスレッドを実行するアプリケーションの場合は、特定のスレッドを先に実行したい場合があります.
    複数のスレッドがAという名前のインスタンスにアクセスしようとすると、一度に1つしかアクセスできないからです.
  • オブジェクトとインスタンスの違い:TestReference=new Test();
  • Threadクラスでは、開発者がスレッドの優先度を設定できます.
    Thread.setPriority() // 1~10까지 안에 숫자를 넣는다. 기본적으로 값이 5 이다.
    ただし、高度な知識がない場合、エラーが発生する可能性が高いため、スレッド優先度をできるだけ使用しないことをお勧めします.

    6 . 👀 マルチスレッドと同期



    2つのスレッドが同じ値を同時に変更したらどうなりますか?
    1000元の残高があり、A Threedが500元と同時にB Threedが1000元を出すと、
    残高はまだ控除されていないので、1500ウォンが引き出されます.では、同期の問題をどのように解決しますか?

    1. lock, monitor, synchronized


    複数のスレッドがオブジェクトにアクセスするときに同時にアクセスしないように、heapにロックを作成し、生成されたロックがsynchronizedキーワードで使用されます.
    public class SynchronizedTest{
    
    	public synchronized String drawOutString(String money money)
        throws AccountException{
        // 잔액을 계산하여 크면 정상처리하고, 반대일 경우 AccountException을 처리한다.
        }
    }
    
  • ブロックの使用方法(性能低下のため、ブロックの使用を推奨!)
  • 
    public class SynchronizedTest{
    
    	public String drawOutString(String money money)
        throws AccountException{
        
        	synchronized(userAccount){
        	}
        }
    }
    Sychronizedを使用する場合

    1.モニタは対象のロックをチェックします。


    2.スレッドがrockを使用していない場合はjvmに通知します。


    3.jvmは「monitorenter」というコマンドを使用してrockをリクエストしたスレッドに送信します。


    4.積み木が完成したら楽子を返す。


    2. wait, notify, notifyAll


  • Wait():Rockに戻り待機状態に入ります(呼び覚ますまで潜ります)



  • notify():待機中のスレッドを起動



  • notifyall():すべての待機を呼び覚ます(通常はよく使用されます)


  • 3. ThreadLocal


    ThreadLocalとは?


    一般的な変数の寿命は、コードブロックの範囲内でのみ有効であり、ThreadLocalではスレッド領域に変数を設定できます.これにより、スレッドが実行されるすべての領域で変数を使用できます.
    //その後続行