【java同時】複数スレッド間共有データ
まず、マルチスレッド間でデータを共有する問題を見てみましょう.
2つのスレッドがdataに対して1ずつ増加し、2つのスレッドがdataに対して1ずつ減少する4つのスレッドを設計します.
問題から,スレッド間パスデータの共有,4つのスレッドが1つのdataを共有し,1つのdataを共同で操作することに明らかになった.まず、上記の問題を片側に置いて、複数のスレッド間でデータを共有する場合をゆっくり分析し、最も簡単なことから、分類分析が終わったら、その時になっても上記の問題を解決します.
1.スレッドごとに同じタスクを実行
これは最も簡単な状況で、例えば切符を売って、いくつかのスレッドが共同で切符の数を記録する変数を操作して、任務はすべてそれを1つ減らすことです.この場合,クラス実装Runnableインタフェースを1つ書くだけでよいが,run()メソッドでこのチケットを1つ減らし,このRunnalbeを複数のスレッドに投げて実行し,自然に同じdataを操作する.コードを見てみましょう.
これはよく理解できて、簡単に実現できて、4つのスレッドで4枚の切符を売った.実行結果:
Thread-0: 100 Thread-3: 99 Thread-2: 98 Thread-1: 97
2.スレッドごとに異なるタスクを実行
上記のトピックで説明したように、2つのスレッドはdata増加を実行し、2つのスレッドはdata減少を実行する.このような状況に対して、我々は2つのRunnableを実現しなければならない.明らかに2つの異なるタスクがあるため、1つのタスクはdataを実行して増加し、もう1つのタスクはdataを実行して減少する.メンテナンスを容易にするために、2つのタスクメソッドを1つのクラスに配置し、dataもこのクラスに配置し、異なるRunnableに転送することで、データの共有を完了できます.次のようになります.
印刷結果を見てください.
Thread-0: before : 0 Thread-0: after : 1 Thread-1: before : 1 Thread-1: after : 2 Thread-2: before : 2 Thread-2: after : 1 Thread-3: before : 1 Thread-3: after : 0
このように書く利点は,2つのタスクメソッドが直接メソッド名で同期操作できることであり,このモードの利点は前の博文で述べたように,パッケージ化がよい.最後に、複数のスレッド間でデータを共有するには、主に2つの点に注目すればいいとまとめました.1つはどんなタスクですか.いくつの任務ですか.二つ目はいくつのスレッドですか.いくつかのタスクといくつかのスレッドは関係ないことを覚えておいてください.100スレッドで1つのタスクを実行することも、2つのタスクを実行することも、3つのタスクを実行することもできます.1つのタスクしかない場合は、複数のスレッドが1つのタスクを実行することを示します.私たちは1つのRunnableインタフェースを実現し、共通dataをRunnableに入れます.任務をrun()に入れればよい(タスクは同期することに注意します)、それからN個のスレッドを開いてこのタスクを実行すればいいです.M個のタスクがあれば、私たちは新しいタスクを専門に実行するクラスを作って、共通のdataをクラスに入れて、タスクをクラスの同期方法として、それからN個のスレッドを開いて、各スレッドの中でRunnableを投げて、要求通りにタスククラスの方法を実行すればいいです.ここで、やっとタスクとスレッドの分離を体得することができて、このような思想も対象の1種に向いているようにしましょう、前に勉強する時何の感じもなくて、今総括すればするほど感じの構想はもっとはっきりしています.
関連情報:http://blog.csdn.net/column/details/bingfa.html
-分かち合い、共に進歩する!-詳細については、以下を参照してください.http://blog.csdn.net/eson_15
2つのスレッドがdataに対して1ずつ増加し、2つのスレッドがdataに対して1ずつ減少する4つのスレッドを設計します.
問題から,スレッド間パスデータの共有,4つのスレッドが1つのdataを共有し,1つのdataを共同で操作することに明らかになった.まず、上記の問題を片側に置いて、複数のスレッド間でデータを共有する場合をゆっくり分析し、最も簡単なことから、分類分析が終わったら、その時になっても上記の問題を解決します.
1.スレッドごとに同じタスクを実行
これは最も簡単な状況で、例えば切符を売って、いくつかのスレッドが共同で切符の数を記録する変数を操作して、任務はすべてそれを1つ減らすことです.この場合,クラス実装Runnableインタフェースを1つ書くだけでよいが,run()メソッドでこのチケットを1つ減らし,このRunnalbeを複数のスレッドに投げて実行し,自然に同じdataを操作する.コードを見てみましょう.
public class MultiThreadShareData {
public static void main(String[] args) {
ShareData task = new ShareData(); // Runnable
for(int i = 0; i < 4; i ++) { //
new Thread(task).start();
}
}
}
class ShareData implements Runnable {
private int data = 100;
@Override
public void run() { // , , 0
// while(data > 0) {
synchronized(this) {
if(data > 0) {
System.out.println(Thread.currentThread().getName() + ": " + data);
data--;
}
}
// }
}
}
これはよく理解できて、簡単に実現できて、4つのスレッドで4枚の切符を売った.実行結果:
Thread-0: 100 Thread-3: 99 Thread-2: 98 Thread-1: 97
2.スレッドごとに異なるタスクを実行
上記のトピックで説明したように、2つのスレッドはdata増加を実行し、2つのスレッドはdata減少を実行する.このような状況に対して、我々は2つのRunnableを実現しなければならない.明らかに2つの異なるタスクがあるため、1つのタスクはdataを実行して増加し、もう1つのタスクはdataを実行して減少する.メンテナンスを容易にするために、2つのタスクメソッドを1つのクラスに配置し、dataもこのクラスに配置し、異なるRunnableに転送することで、データの共有を完了できます.次のようになります.
public class MultiThreadShareData {
public static void main(String[] args) {
ShareData task = new ShareData(); // task
for(int i = 0; i < 2; i ++) { // data
new Thread(new Runnable() {
@Override
public void run() {
task.increment();
}
}).start();
}
for(int i = 0; i < 2; i ++) { // data
new Thread(new Runnable() {
@Override
public void run() {
task.decrement();
}
}).start();
}
}
}
class ShareData /*implements Runnable*/ {
private int data = 0;
public synchronized void increment() { // data
System.out.println(Thread.currentThread().getName() + ": before : " + data);
data++;
System.out.println(Thread.currentThread().getName() + ": after : " + data);
}
public synchronized void decrement() { // data
System.out.println(Thread.currentThread().getName() + ": before : " + data);
data--;
System.out.println(Thread.currentThread().getName() + ": after : " + data);
}
}
印刷結果を見てください.
Thread-0: before : 0 Thread-0: after : 1 Thread-1: before : 1 Thread-1: after : 2 Thread-2: before : 2 Thread-2: after : 1 Thread-3: before : 1 Thread-3: after : 0
このように書く利点は,2つのタスクメソッドが直接メソッド名で同期操作できることであり,このモードの利点は前の博文で述べたように,パッケージ化がよい.最後に、複数のスレッド間でデータを共有するには、主に2つの点に注目すればいいとまとめました.1つはどんなタスクですか.いくつの任務ですか.二つ目はいくつのスレッドですか.いくつかのタスクといくつかのスレッドは関係ないことを覚えておいてください.100スレッドで1つのタスクを実行することも、2つのタスクを実行することも、3つのタスクを実行することもできます.1つのタスクしかない場合は、複数のスレッドが1つのタスクを実行することを示します.私たちは1つのRunnableインタフェースを実現し、共通dataをRunnableに入れます.任務をrun()に入れればよい(タスクは同期することに注意します)、それからN個のスレッドを開いてこのタスクを実行すればいいです.M個のタスクがあれば、私たちは新しいタスクを専門に実行するクラスを作って、共通のdataをクラスに入れて、タスクをクラスの同期方法として、それからN個のスレッドを開いて、各スレッドの中でRunnableを投げて、要求通りにタスククラスの方法を実行すればいいです.ここで、やっとタスクとスレッドの分離を体得することができて、このような思想も対象の1種に向いているようにしましょう、前に勉強する時何の感じもなくて、今総括すればするほど感じの構想はもっとはっきりしています.
関連情報:http://blog.csdn.net/column/details/bingfa.html
-分かち合い、共に進歩する!-詳細については、以下を参照してください.http://blog.csdn.net/eson_15