【35期】談?wù)勀銓?duì)Java線程之間通信方式的理解
閱讀本文大概需要 5?分鐘。
來自:cnblogs.com/hapjin/p/5492619.html
①同步
②while輪詢的方式
③wait/notify機(jī)制
④管道通信
一,介紹
二,線程間的通信方式
①同步
public?class?MyObject?{
????synchronized?public?void?methodA()?{
????????//do?something....
????}
????synchronized?public?void?methodB()?{
????????//do?some?other?thing
????}
}
public?class?ThreadA?extends?Thread?{
????private?MyObject?object;
//省略構(gòu)造方法
????@Override
????public?void?run()?{
????????super.run();
????????object.methodA();
????}
}
public?class?ThreadB?extends?Thread?{
????private?MyObject?object;
//省略構(gòu)造方法
????@Override
????public?void?run()?{
????????super.run();
????????object.methodB();
????}
}
public?class?Run?{
????public?static?void?main(String[]?args)?{
????????MyObject?object?=?new?MyObject();
????????//線程A與線程B?持有的是同一個(gè)對(duì)象:object
????????ThreadA?a?=?new?ThreadA(object);
????????ThreadB?b?=?new?ThreadB(object);
????????a.start();
????????b.start();
????}
}
②while輪詢的方式
import?java.util.ArrayList;
import?java.util.List;
public?class?MyList?{
????private?List?list?=?new?ArrayList ();
????public?void?add()?{
????????list.add("elements");
????}
????public?int?size()?{
????????return?list.size();
????}
}
import?mylist.MyList;
public?class?ThreadA?extends?Thread?{
????private?MyList?list;
????public?ThreadA(MyList?list)?{
????????super();
????????this.list?=?list;
????}
????@Override
????public?void?run()?{
????????try?{
????????????for?(int?i?=?0;?i?10;?i++)?{
????????????????list.add();
????????????????System.out.println("添加了"?+?(i?+?1)?+?"個(gè)元素");
????????????????Thread.sleep(1000);
????????????}
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}
import?mylist.MyList;
public?class?ThreadB?extends?Thread?{
????private?MyList?list;
????public?ThreadB(MyList?list)?{
????????super();
????????this.list?=?list;
????}
????@Override
????public?void?run()?{
????????try?{
????????????while?(true)?{
????????????????if?(list.size()?==?5)?{
????????????????????System.out.println("==5,?線程b準(zhǔn)備退出了");
????????????????????throw?new?InterruptedException();
????????????????}
????????????}
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}
import?mylist.MyList;
import?extthread.ThreadA;
import?extthread.ThreadB;
public?class?Test?{
????public?static?void?main(String[]?args)?{
????????MyList?service?=?new?MyList();
????????ThreadA?a?=?new?ThreadA(service);
????????a.setName("A");
????????a.start();
????????ThreadB?b?=?new?ThreadB(service);
????????b.setName("B");
????????b.start();
????}
}
③wait/notify機(jī)制
import?java.util.ArrayList;
import?java.util.List;
public?class?MyList?{
????private?static?List?list?=?new?ArrayList ();
????public?static?void?add()?{
????????list.add("anyString");
????}
????public?static?int?size()?{
????????return?list.size();
????}
}
public?class?ThreadA?extends?Thread?{
????private?Object?lock;
????public?ThreadA(Object?lock)?{
????????super();
????????this.lock?=?lock;
????}
????@Override
????public?void?run()?{
????????try?{
????????????synchronized?(lock)?{
????????????????if?(MyList.size()?!=?5)?{
????????????????????System.out.println("wait?begin?"
????????????????????????????+?System.currentTimeMillis());
????????????????????lock.wait();
????????????????????System.out.println("wait?end??"
????????????????????????????+?System.currentTimeMillis());
????????????????}
????????????}
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}
public?class?ThreadB?extends?Thread?{
????private?Object?lock;
????public?ThreadB(Object?lock)?{
????????super();
????????this.lock?=?lock;
????}
????@Override
????public?void?run()?{
????????try?{
????????????synchronized?(lock)?{
????????????????for?(int?i?=?0;?i?10;?i++)?{
????????????????????MyList.add();
????????????????????if?(MyList.size()?==?5)?{
????????????????????????lock.notify();
????????????????????????System.out.println("已經(jīng)發(fā)出了通知");
????????????????????}
????????????????????System.out.println("添加了"?+?(i?+?1)?+?"個(gè)元素!");
????????????????????Thread.sleep(1000);
????????????????}
????????????}
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}
public?class?Run?{
????public?static?void?main(String[]?args)?{
????????try?{
????????????Object?lock?=?new?Object();
????????????ThreadA?a?=?new?ThreadA(lock);
????????????a.start();
????????????Thread.sleep(50);
????????????ThreadB?b?=?new?ThreadB(lock);
????????????b.start();
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}
④管道通信
推薦閱讀:
【34期】談?wù)劄槭裁匆鸱謹(jǐn)?shù)據(jù)庫?有哪些方法?
【33期】分別談?wù)劼?lián)合索引生效和失效的條件
【32期】你知道Redis的字符串是怎么實(shí)現(xiàn)的嗎?
微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?
評(píng)論
圖片
表情

