JAva実装スレッドの3つの方法,stop()とsuspend()メソッドはなぜ推奨されないのか
6752 ワード
文書ディレクトリ1スレッドの実装 1.1 Threadクラス継承 1.2 Runnableクラスを実現 1.3スレッドプール書き方 2 stopとsuspendメソッド 1スレッドの実装
JAva 5以前は、
1.1 Threadクラスの継承
1.2 Runnableクラスの実装
1.3スレッドプールの書き方
2 stopとsuspendメソッド
JAva 5以前は、
new Thread()
とnew Thread(runnable)
の2つの実装方法があり、1つ目は直接thread run
を呼び出す方法であるため、Thread
サブクラス、すなわちnew SubThread()
を用いることが多かった.第2の呼び出しrunnable
のrun
メソッド.それぞれ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()でスレッドを再起動します.