JAvaにおける従来のスレッド通信の個人的見解
共通データを使用した経験があります.共通データ(同期ロックを含む)を使用するいくつかの方法は、同じクラスに配置します.プログラムの高集約を体現し、プログラムの堅牢性を強化します.
もう1つの経験は、スレッド内ではなく、同期コードやロックを共通のデータに置くことです.このようなメリットは何ですか.まず、オブジェクト向けの考え方に合っています.次に,この設計構造はスレッドの同期を容易に実現し,スレッドが共通データにアクセスするたびにスレッド内に同期コードを追加する必要がない.拡張とメンテナンスに役立ちます.
まず一例を見ると、サブスレッドはまず10回循環し、メインスレッドは100回循環し、次にサブスレッドは10回循環し、メインスレッドは100回循環し、このように50回循環する.
実装コードは次のとおりです.
もう一つ注意しなければならないのは、待つかどうかを判断する場所がなぜifではなくwhileに使われているのかということです.なぜなら、waitを使うときにnotifyを呼び出さないうちに自分で起こして、コードを実行し始める可能性があるからです.これを偽目覚ましと言います.whileを使用すると、偽の起動による災害を回避し、コードを実行できるかどうかを判断することができます.
もう1つの経験は、スレッド内ではなく、同期コードやロックを共通のデータに置くことです.このようなメリットは何ですか.まず、オブジェクト向けの考え方に合っています.次に,この設計構造はスレッドの同期を容易に実現し,スレッドが共通データにアクセスするたびにスレッド内に同期コードを追加する必要がない.拡張とメンテナンスに役立ちます.
まず一例を見ると、サブスレッドはまず10回循環し、メインスレッドは100回循環し、次にサブスレッドは10回循環し、メインスレッドは100回循環し、このように50回循環する.
実装コードは次のとおりです.
public class TraditionalThreadConnection {
/**
* @param args
*/
public static void main(String[] args) {
final Service service = new Service();
//
new Thread(new Runnable(){
@Override
public void run() {
for(int i = 1;i<=50;i++){
service.subThread(i);
}
}
}).start();
//
for(int i = 1;i<=50;i++){
service.mainThread(i);
}
}
}
class Service{
/* */
private boolean isSub = true;
public synchronized void subThread(int loop){
// ,
while(!isSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=10;i++){
System.out.println("sub-thread-" + i + ",loop--" + loop);
}
isSub = false;
//
this.notify();
}
public synchronized void mainThread(int loop){
while(isSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=1;i<=100;i++){
System.out.println("main-thread-" + i + ",loop--" + loop);
}
isSub = true;
this.notify();
}
}
もう一つ注意しなければならないのは、待つかどうかを判断する場所がなぜifではなくwhileに使われているのかということです.なぜなら、waitを使うときにnotifyを呼び出さないうちに自分で起こして、コードを実行し始める可能性があるからです.これを偽目覚ましと言います.whileを使用すると、偽の起動による災害を回避し、コードを実行できるかどうかを判断することができます.