⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adventuredragon.java

📁 a simple java mutlti thread concurrency program src code
💻 JAVA
字号:
import Utilities.*;
import Synchronization.*;

class Adventurer extends MyObject implements Runnable {

  private int cntStones;
  private int cntRings;
  private int cntNecklaces;
  
  private int cntFortune;//record fortune number
  static int f_size;//max fortune size
  //private ADmonitor admon = null;
  private EstablishRendezvous er = null;


  //public Adventurer(String name,int f_size,ADmonitor admon){
  public Adventurer(String name,int f_size,EstablishRendezvous er){
       super(name);
       this.f_size = f_size;
       //this.admon = admon;
       this.er = er;
       cntFortune =0; 
       cntStones =(int)(Math.random() * 2 + 0.5); //init
       cntRings =(int)(Math.random() * 2 + 0.5);
       cntNecklaces =(int)(Math.random() * 2 + 0.5);
       new Thread(this).start();

  }
  public void goHome(){
	System.out.println(getName()
	            + " have enough fortune,he go home now" );
     Thread.interrupted();
     	  
  }
  public int canMakeJewel(){
	if (cntStones<1) return -1;
	if  (cntRings>=1)return 1;//magic ring
	if  (cntNecklaces>=1)return 2;//magic necklace
	return -1; //1,0,0 case
		
  }
  public void makeJewel(int f_type){
	  if (f_type==1)cntRings--;
	  if (f_type==2)cntNecklaces--;
	  cntStones--;
	  cntFortune++;
	  System.out.println("age=" + age() + ", " + getName()
	            + " accumulate a new jewel!Now his fortune size:" +cntFortune);
  
  }
  public int playDice(){ //return 1:win -1:lose
		  
	  int dice_A =(int)(Math.random() * 6);
	  int dice_D =(int)(Math.random() * 6);
	  if (dice_A >= dice_D ){ //adventurer win
		  int item = (int)(Math.random() * 2+0.5);
		  switch  (item){
		  case 0:
			  cntStones++;
			  break;
		  case 1:
			  cntRings++;
			  break;
		  case 2:
			  cntNecklaces++;
			  break;
		  default: 
			  
		  } 
		System.out.println("age=" + age() + ", " + getName()+ " win an item in playing dice" );  
		return 1;
	  }else { //adventurer lose
			System.out.println("age=" + age() + ", " + getName()
			            + " lose in playing dice" );
			//admon.loseDragon();
			//admon.leaveDragon();
			//admon.meetDragon();
			return -1;  
	   }
		     
		  
  }
	  
  
  public void run() {
     int tt;
	System.out.println("age=" + age() + ", " + getName()
            + " stones:" + cntStones + " rings:" + cntRings + " Necklaces:"+ cntNecklaces);
 
	  tt = canMakeJewel();
	  AdvMessage rrr;
	 do{
	  if (tt>0){
		  rrr = new AdvMessage(getName(),"MakeJewel");
		  System.out.println("age()=" + age() + ", " + getName()
		            + " wants to MakeJewel");

		  //admon.enterShop();
		  //admon.findClerk();
		  rrr = (AdvMessage)
		  	er.clientToServer().clientMakeRequestAwaitReply(rrr);

		  makeJewel(tt);
		  System.out.println("age()=" + age() + ", " + getName()
		            + " after MakeJewel");

		  //admon.leaveClerk();
		  //admon.leaveShop();
	  }
      tt = canMakeJewel();	  
	 }while(tt>0);
	 
	 if (cntFortune==f_size)goHome();
	 
	 while(cntFortune<f_size){
		 //admon.meetDragon();
		 rrr = new AdvMessage(getName(),"PlayDice");
		 System.out.println("age()=" + age() + ", " + getName()
		            + " wants to PlayDice");
		 do{  //play dice with dragon util can make jewel 
			 rrr = (AdvMessage)
			  	er.clientToServer().clientMakeRequestAwaitReply(rrr);

			 int success = playDice();
			 if(success<0){ //lose 
				 //admon.leaveDragon();
				 //admon.meetDragon();//??go back end of line
			 }
			 tt = canMakeJewel();
		 }while(tt<0);
		 //admon.leaveDragon();
		 //go to shop
		 //admon.enterShop();
		 //admon.findClerk();
		  rrr = new AdvMessage(getName(),"MakeJewel");
		  System.out.println("age()=" + age() + ", " + getName()
		            + " wants to MakeJewel");
		  rrr = (AdvMessage)
		  	er.clientToServer().clientMakeRequestAwaitReply(rrr); 
		 makeJewel(tt);
		 //admon.leaveClerk();
		 //admon.leaveShop();	 
	 }
	 rrr = new AdvMessage(getName(),"goHome");
	  System.out.println("age()=" + age() + ", " + getName()
	            + " wants to goHome");
	  rrr = (AdvMessage)
	  	er.clientToServer().clientMakeRequestAwaitReply(rrr);
	 goHome();
	 
  }

 
	  
}


class Dragon extends MyObject implements Runnable {

   private int cNap = 0; // milliseconds
   
   public Dragon(String name) {
      super(name);
      new Thread(this).start();

   }

   public void run() {
      double item;
      int napping;
      
   }
}

class AdventureDragon extends MyObject {

   public static void main(String[] args) {
   // parse command line arguments, if any, to override defaults
      GetOpt go = new GetOpt(args, "Ua:c:g:f:");
      go.optErr = true;
      String usage = "Usage: -a numAdv -c numClerk -g group_size -f fortune_size";
      int numAdv = 9;	// defaults
      int numClerk = 2;
      int group_Size = 3;       
      int fortune_size = 5;       
      
      int ch = -1;
      while ((ch = go.getopt()) != go.optEOF) {
         if      ((char)ch == 'U') {
            System.out.println(usage);  System.exit(0);
         }
         else if ((char)ch == 'a')
            numAdv = go.processArg(go.optArgGet(), numAdv);
         else if ((char)ch == 'c')
            numClerk = go.processArg(go.optArgGet(), numClerk);
         else if ((char)ch == 'g')
            group_Size  = go.processArg(go.optArgGet(), group_Size );
         else if ((char)ch == 'f')
            fortune_size = go.processArg(go.optArgGet(), fortune_size);
         else {
            System.err.println(usage);  System.exit(1);
         }
      }
      System.out.println("AdventureDragon: numAdv =" + numAdv + ", numClerk ="
         + numClerk + ", group_Size=" + group_Size + ", fortune_size=" + fortune_size);

      //ADmonitor admon = new ADmonitor(group_Size, numClerk);
      boolean threadedServer = true;//false;
      if (threadedServer)
          System.out.println
             ("Each client request will be handled in its own server thread");

       // create the server
       EstablishRendezvous er = new EstablishRendezvous();
       MultiThreadedServer s = new MultiThreadedServer(er, threadedServer);
      
	  for (int i = 0; i < numAdv; i++)
      	//new Adventurer("Adventurer"+i, fortune_size,admon );
		  new Adventurer("Adventurer"+i, fortune_size,er ); 
      new Dragon("Dragon");

   	  System.out.println("All threads started");

   	   // let them run for a while
   	   nap(10*1000);
  	    System.out.println("age()=" + age()
   		      + ", time to stop the threads and exit");
  	    System.exit(0);

   }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -