⑴ java多線程共同操作同一個隊列,怎麼實現
以下是兩個線程:
import java.util.*;
public class Thread_List_Operation {
//假設有這么一個隊列
static List list = new LinkedList();
public static void main(String[] args) {
Thread t;
t = new Thread(new T1());
t.start();
t = new Thread(new T2());
t.start();
}
}
//線程T1,用來給list添加新元素
class T1 implements Runnable{
void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "為隊列添加了一個元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}
}
}
//線程T2,用來給list添加新元素
class T2 implements Runnable{
void getElemt(Object o){
Thread_List_Operation.list.add(o);
System.out.println(Thread.currentThread().getName() + "為隊列添加了一個元素");
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
getElemt(new Integer(1));
}
}
}
//結果(亂序)
Thread-0為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-1為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
Thread-0為隊列添加了一個元素
⑵ Java涓鍏充簬濡備綍瀹炵幇澶氱嚎紼嬫秷鎮闃熷垪鐨勫疄渚(java澶氱嚎紼嬮氫俊)
java涓鐨勬秷鎮闃熷垪
娑堟伅闃熷垪鏄綰跨▼闂撮氳鐨勬墜孌碉細
importjava.util.*
publicclassMsgQueue{
privateVectorqueue=null;
publicMsgQueue(){
queue=newVector();
}
publicvoidsend(Objecto)
{
queue.addElement(o);
}
publicObjectrecv()
{
if(queue.size()==0)
returnnull;
Objecto=queue.();
queue.(0);//orqueue[0]=nullcanalsowork
returno;
}
}
鍥犱負java涓鏄痩ockedbyobject鐨勬墍浠ユ坊鍔犲氨鍙浠ョ敤浜庣嚎紼嬪悓姝ラ攣瀹氬硅薄
鍙浠ヤ綔涓哄氱嚎紼嬪勭悊澶氫換鍔$殑瀛樻斁task鐨勯槦鍒椼備粬鐨刢lient鍖呮嫭灝佽呭ソ鐨則ask綾諱互鍙妕hread綾
Java鐨勫氱嚎紼-綰跨▼闂寸殑閫氫俊2009-08-2521:58
1.綰跨▼鐨勫嚑縐嶇姸鎬
綰跨▼鏈夊洓縐嶇姸鎬侊紝浠諱綍涓涓綰跨▼鑲瀹氬勪簬榪欏洓縐嶇姸鎬佷腑鐨勪竴縐嶏細
1)浜х敓錛圢ew錛夛細綰跨▼瀵硅薄宸茬粡浜х敓錛屼絾灝氭湭琚鍚鍔錛屾墍浠ユ棤娉曟墽琛屻傚傞氳繃new浜х敓浜嗕竴涓綰跨▼瀵硅薄鍚庢病瀵瑰畠璋冪敤start()鍑芥暟涔嬪墠銆
2)鍙鎵ц岋紙Runnable錛夛細姣忎釜鏀鎸佸氱嚎紼嬬殑緋葷粺閮芥湁涓涓鎺掔▼鍣錛屾帓紼嬪櫒浼氫粠綰跨▼奼犱腑閫夋嫨涓涓綰跨▼騫跺惎鍔ㄥ畠銆傚綋涓涓綰跨▼澶勪簬鍙鎵ц岀姸鎬佹椂錛岃〃紺哄畠鍙鑳芥e勪簬綰跨▼奼犱腑絳夊緟鎺掓帓紼嬪櫒鍚鍔ㄥ畠錛涗篃鍙鑳藉畠宸叉e湪鎵ц屻傚傛墽琛屼簡涓涓綰跨▼瀵硅薄鐨剆tart()鏂規硶鍚庯紝綰跨▼灝卞勪簬鍙鎵ц岀姸鎬侊紝浣嗘樉鑰屾槗瑙佺殑鏄姝ゆ椂綰跨▼涓嶄竴瀹氭e湪鎵ц屼腑銆
3)姝諱骸錛圖ead錛夛細褰撲竴涓綰跨▼姝e父緇撴潫錛屽畠渚垮勪簬姝諱骸鐘舵併傚備竴涓綰跨▼鐨剅un()鍑芥暟鎵ц屽畬姣曞悗綰跨▼灝辮繘鍏ユ諱骸鐘舵併
4)鍋滄粸錛圔locked錛夛細褰撲竴涓綰跨▼澶勪簬鍋滄粸鐘舵佹椂錛岀郴緇熸帓紼嬪櫒灝變細蹇界暐瀹冿紝涓嶅瑰畠榪涜屾帓紼嬨傚綋澶勪簬鍋滄粸鐘舵佺殑綰跨▼閲嶆柊鍥炲埌鍙鎵ц岀姸鎬佹椂錛屽畠鏈夊彲鑳介噸鏂版墽琛屻傚傞氳繃瀵逛竴涓綰跨▼璋冪敤wait()鍑芥暟鍚庯紝綰跨▼灝辮繘鍏ュ仠婊炵姸鎬侊紝鍙鏈夊綋涓ゆ″硅ョ嚎紼嬭皟鐢╪otify鎴杗otifyAll鍚庡畠鎵嶈兘涓ゆ″洖鍒板彲鎵ц岀姸鎬併
2.classThread涓嬬殑甯哥敤鍑芥暟鍑芥暟
2.1suspend()銆乺esume()
1)閫氳繃suspend()鍑芥暟錛屽彲浣跨嚎紼嬭繘鍏ュ仠婊炵姸鎬併傞氳繃suspend()浣跨嚎紼嬭繘鍏ュ仠婊炵姸鎬佸悗錛岄櫎闈炴敹鍒皉esume()娑堟伅錛屽惁鍒欒ョ嚎紼嬩笉浼氬彉鍥炲彲鎵ц岀姸鎬併
2)褰撹皟鐢╯uspend()鍑芥暟鍚庯紝綰跨▼涓嶄細閲婃斁瀹冪殑鈥滈攣鏍囧織鈥濄
渚11錛
classextendsThread{
publicstaticintshareVar=0;
public(Stringname){
super(name);
}
publicvoidrun(){
if(shareVar==0){
for(inti=0;i<5;i){
shareVar;
if(shareVar==5){
this.suspend();//錛1錛
}}}
else{
System.out.print(Thread.().getName());
System.out.println("shareVar="shareVar);
this.resume();//錛2錛
}}
}
publicclassTestThread{
publicstaticvoidmain(String[]args){
t1=new("t1");
t2=new("t2");
t1.start();//錛5錛
//t1.start();//錛3錛
t2.start();//錛4錛
}}