JAva実装スレッドの3つの方法,stop()とsuspend()メソッドはなぜ推奨されないのか

6752 ワード

文書ディレクトリ
  • 1スレッドの実装
  • 1.1 Threadクラス継承
  • 1.2 Runnableクラスを実現
  • 1.3スレッドプール書き方
  • 2 stopとsuspendメソッド
  • 1スレッドの実装
    JAva 5以前は、new Thread()new Thread(runnable)の2つの実装方法があり、1つ目は直接thread runを呼び出す方法であるため、Threadサブクラス、すなわちnew SubThread()を用いることが多かった.第2の呼び出しrunnablerunメソッド.それぞれThreadクラスの継承とRunnableインタフェースの実装
    1.1 Threadクラスの継承new Thread(){}.start() ;これは呼び出しThreadサブクラスオブジェクトのrunメソッドを示し、newThread(){}1つThreadの匿名サブクラスのインスタンスオブジェクトを示し、サブクラスにrunメソッドを加えたコードは以下の通りである.
    new Thread(){
        public void run(){
        	//  
        }
    }.start();
    

    1.2 Runnableクラスの実装new Thread(newRunnable(){}).start() ;これは呼び出しThreadオブジェクトが受け付けたRunnableオブジェクトのrunメソッドを示し、newRunnable(){}1つRunnableの匿名サブクラスのインスタンスオブジェクトを示し、runnableのサブクラスにrunメソッドを加えたコードは以下の通りである.
    new Thread(newRunnable(){
                      public void run(){
    						//  
                      }     
              }
    
        ).start();
    

    1.3スレッドプールの書き方java5から、マルチスレッドを作成する方法は次のとおりです.
    ExecutorService pool= Executors.newFixedThreadPool(3)
    for(inti=0;i<10;i++){
    		 pool.execute(new Runable(){public voidrun(){}});
    }
    //        
    Executors.newCachedThreadPool().execute(newRunable(){public void run(){}});
    //         
    Executors.newSingleThreadExecutor().execute(newRunable(){public void run(){}});
    

    2 stopとsuspendメソッドsynchronizedキーワード修飾同期方式で使用に反対stop()安全でないため.スレッドによって取得されたすべてのロックが解除され、オブジェクトが一貫性のない状態にある場合、他のスレッドはその状態でチェックおよび変更できます.その結果、本当の問題点を検出するのは難しい.suspend()方法でデッドロックが発生しやすい.suspend()を呼び出すと、ターゲットスレッドは停止しますが、それまでに得られたロックは保持されます.この場合、" "のスレッドによって実行が再開されない限り、ロックされたリソースには他のスレッドはアクセスできません. , , デッドロックになります.だから使うべきではないsuspend()、自分のThreadクラスの中で1つの標識を置くべきで、スレッドが活動するべきかそれとも保留するべきかを指摘します.フラグがスレッドが保留されるべきであることを示すと、wait()で待機状態に入るように命令します.フラグがスレッドを復元すべきであることを示す場合は、notify()でスレッドを再起動します.