熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java多線程例子

2022-06-13   來源: Java高級技術 

  寫出一組模擬生產者/消費者的協作程序

  其中包括一個WoToujava代表消息

  一個MsgQueuejava為一個隊列提供put(Message msg)方法和get()方法

  一個Produerjava為生產者線程在其run方法中每隔秒產生一個Message對像並放入MsgQueue隊列

  一個Consumerjava為消費者線程在其run方法中不斷從MsgQueue隊列中獲取Message對像並顯示在屏幕上

  一個TestMainjava在其main方法中啟動個Produer線程和個消費者線程

  要求

  對於MsgQueuejava隊列的長度為當消息超過個時put()方法需要阻塞當消息隊列為空時

  get()方法需要阻塞

  public class ProducerConsumer {

  public static void main(String[] args) {

  SyncStack ss = new SyncStack();

  Producer p= new Producer(ssp);

  Consumer c= new Consumer(ssc);

  Producer p= new Producer(ssp);

  Consumer c= new Consumer(ssc);

  }

  }

  class WoTou<T> {

  int id;

  WoTou(int id) {

  thisid = id;

  }

  public String toString() {

  return WoTou : + id;

  }

  }

  class SyncStack {

  int index = ;

  WoTou[] arrWT = new WoTou[];

  public void push(WoTou wt) {

  while(index == arrWTlength) {

  try {

  thiswait();

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  thisnotifyAll();

  arrWT[index] = wt;

  index ++;

  }

  public WoTou pop() {

  while(index == ) {

  try {

  thiswait();

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  thisnotifyAll();

  index;

  return arrWT[index];

  }

  }

  class Producer implements Runnable {

  SyncStack ss = null;

  String a;

  Producer(SyncStack ssString a) {

  thisss = ss;

  thisa= a;

  Thread t=new Thread(thisa);

  tstart();

  }

  public void run() {

  for(int i=; i<; i++) {

  synchronized(ss){

  WoTou wt = new WoTou(i);

  sspush(wt);

  Systemoutprintln(a+ 生產了 + wt);}

  try {

  Threadsleep((int)(Mathrandom() * ));

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  }

  class Consumer implements Runnable {

  SyncStack ss = null;

  String a;

  Thread t;

  Consumer(SyncStack ssString a) {

  thisss = ss;

  thisa= a;

  t=new Thread(thisa);

  tstart();

  }

  public void run() {

  for(int i=; i<; i++) {

  synchronized(ss){

  WoTou wt = sspop();

  Systemoutprintln(a+ 消費了: + wt);}

  try {

  Threadsleep((int)(Mathrandom() * ));

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  }

  p 生產了WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  c 消費了: WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  p 生產了WoTou :

  棧裡有

  作為多線程交互一的一個重要應用定義用戶輸入和輸出的列隊類或者堆棧類一定要看成一個整體放進同步語句塊裡面不能簡單的分別調用輸入同步方法或者輸出同步方法下面的程序就有問題 下面這個是一個教程例子但是結果不對究其原因實際上是因為列隊類或者堆棧類是一個可變類 這種可變類要是有參數傳遞給某些不可變類時可變類的構造方法必須也設置成為同步方法不然就會出錯

  public class ProducerConsumer {

  public static void main(String[] args) {

  SyncStack ss = new SyncStack();

  Producer p = new Producer(ss);

  Consumer c = new Consumer(ss);

  new Thread(p)start();

  new Thread(p)start();

  new Thread(p)start();

  new Thread(c)start();

  }

  }

  class WoTou {

  int id;

  WoTou(int id) {

  thisid = id;

  }

  public String toString() {

  return WoTou : + id;

  }

  }

  class SyncStack {

  int index = ;

  WoTou[] arrWT = new WoTou[];

  public synchronized void push(WoTou wt) {

  while(index == arrWTlength) {

  try {

  thiswait();

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  thisnotifyAll();

  arrWT[index] = wt;

  index ++;

  }

  public synchronized WoTou pop() {

  while(index == ) {

  try {

  thiswait();

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  thisnotifyAll();

  index;

  return arrWT[index];

  }

  }

  class Producer implements Runnable {

  SyncStack ss = null;

  Producer(SyncStack ss) {

  thisss = ss;

  }

  public void run() {

  for(int i=; i<; i++) {

  WoTou wt = new WoTou(i);

  sspush(wt);

  Systemoutprintln(生產了 + wt);

  try {

  Threadsleep((int)(Mathrandom() * ));

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  }

  class Consumer implements Runnable {

  SyncStack ss = null;

  Consumer(SyncStack ss) {

  thisss = ss;

  }

  public void run() {

  for(int i=; i<; i++) {

  WoTou wt = sspop();

  Systemoutprintln(消費了: + wt);

  try {

  Threadsleep((int)(Mathrandom() * ));

  } catch (InterruptedException e) {

  eprintStackTrace();

  }

  }

  }

  }

  運行後的結果棧裡有個 為什麼會這樣呢?你思考一下


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27299.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.