Java同時プログラミング3スレッド間通信
5669 ワード
Java同時プログラミング3スレッド間通信
スレッド間通信:複数のスレッドが同じリソースを処理し、タスクが異なる場合、スレッド間の同じ変数の使用または操作を解決するためにスレッド通信が必要です.複数のスレッドが同じデータを操作する際に、同じ共有変数の争いを避けることです.
1.wait/notify
wait/notifyメソッドによるスレッド間通信(wait/notifyはObjectメソッド) waitとnotifyはsynchronizedキーワードと合わせて を使用する必要があります. waitリリースロック、notifyリリースロック
2.ThreadLocal
ThreadLocalは一般的にスレッドローカル変数と呼ばれ、変数をスレッドにバインドし、スレッドごとに独立した変数のコピーを維持する特殊なスレッドバインドメカニズムです.ThreadLocalを使用すると、オブジェクトの表示範囲を同じスレッドに制限できます.ThreadLoalはソースコードを見ることで、実際には各スレッドの変数を1つのMapに格納していることがわかります.
スレッド間通信:複数のスレッドが同じリソースを処理し、タスクが異なる場合、スレッド間の同じ変数の使用または操作を解決するためにスレッド通信が必要です.複数のスレッドが同じデータを操作する際に、同じ共有変数の争いを避けることです.
1.wait/notify
wait/notifyメソッドによるスレッド間通信(wait/notifyはObjectメソッド)
/**
* wait/notify
* Created by lyyz on 18-5-9.
*/
public class SyncTest {
private volatile List list = new ArrayList();
public void add(){
list.add("aaaa");
}
public int getSize(){
return list.size();
}
public static void main(String[] args) {
//lock
//wait/notify synchronized
final Object lock = new Object();
final SyncTest syncTest = new SyncTest();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
try {
for (int i=0;i<10;i++){
syncTest.add();
System.out.println(syncTest.getSize());
Thread.sleep(500);
if (syncTest.getSize()==5){
System.out.println("t1 notify t2");
//notify , , lock
lock.notify();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock){
if(syncTest.getSize()!=5){
try {
//wait , ,
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t2 run");
}
}
},"t2");
t2.start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
t1.start();
}
}
2.ThreadLocal
ThreadLocalは一般的にスレッドローカル変数と呼ばれ、変数をスレッドにバインドし、スレッドごとに独立した変数のコピーを維持する特殊なスレッドバインドメカニズムです.ThreadLocalを使用すると、オブジェクトの表示範囲を同じスレッドに制限できます.ThreadLoalはソースコードを見ることで、実際には各スレッドの変数を1つのMapに格納していることがわかります.
public void set(T value) {
Thread t = Thread.currentThread();//1.
ThreadLocalMap map = getMap(t);//2. ThreadLocalMap
if (map != null)
map.set(this, value);// map , set , threadLocal key, value set
else
createMap(t, value);// map , ThreadLocalMap
}