ビッグデータ8日目の内容



jar
---------------
jar cvf xxx.jar -C classes/.
プロセス
-----------------
プロセス間でメモリが分離されています.メモリは共有されません.
スレッド
-----------------
プログラム実行中に同時実行されるコードセグメント.
スレッド間でメモリを共有できます.
Thread:スレッドクラス.
start()/cpuに通知し、スレッドの実行を開始できます.
run()/スレッドが具体的に実行するコードセグメント.
Thread t = new Thread();
t.start();
Thread.CurrentThread()/現在の実行スレッドを取得します.
yield()/スレッドにcpuのプリエンプト権を放棄させる.
sleep(int mils)/現在のスレッドを指定したミリ秒数スリープ.ロックフラグは解放されません
join//スレッド実行が終了したら別のスレッドを実行
start//cpuがスレッドを起動できることを通知
run//スレッドの主な方法
        isDaemon();//スレッドがデーモンスレッドかどうかを指定する
start();//スレッドの起動
notify()/通知のためにモニタオブジェクトがキュー内のスレッドを待つように選択します.
notifyAll()/すべてのモニタオブジェクト待機キュー内のスレッドを選択して通知します.
wait()/現在のスレッドをモニタの待機キューに入れます.
wait(int n)/スレッドが待機キューに入ると、最大n長時間待機し、自動的に起動します.
スレッドセキュリティ:同期処理が追加されました.同期コードを実行するスレッドが1つしかないことを確認します.
同期メソッドで使用される現在のオブジェクトを同期オブジェクトとして使用します.
デーモンスレッド:
        daemon                 setDaemon(true);//スレッド起動前の設定
        
        
同期コードブロック
        private static Object lock = new Object(); 
//静的オブジェクトlockを作成します.lockはロックフラグです.
        synchronized(lock){}     
//この範囲のプロセスは同期的に実行され、コードが一定期間に1つのスレッドしか同じ実行できないことを保証する.
        synchronized             
//同期関数で使用されるロックフラグが現在のオブジェクト---this
スレッドのセキュリティ:
        synchronized     
同期処理が追加されました.同期コードを実行するスレッドが1つしかないことを確認します.
同期メソッドで使用される現在のオブジェクトを同期オブジェクトとして使用します.
静的メソッドは同期処理を加え、Classを同期オブジェクトとして使用することができます.
例:
ケース1マージャン
package com.work.eight;

import java.lang.Thread;          //  
class Member extends Thread{      //       
    private String name;       
    private int seconds;        
 
    public Member (String name, int sec){
        this.name=name;                
        this.seconds=sec;
    }
    //  run        
    public void run(){
        try{                      //     ,   try catch    
        System.out.println("  :"+name+"  !");
        //System.out.println(seconds*1000);
        System.out.println("  :"+name+"  !   :"+seconds+" !");
        }
        catch(Exception e){
            e.printStackTrace(); 
         
        }
    }
 
}  
 
class Demo1{
    public static void main(String [] args) throws Exception{
        //new   
    	Member m1 = new Member ("  ",5);
    	Member m2 = new Member ("   ",15);
    	Member m3 = new Member ("   ",10);
    	Member m4 = new Member ("   ",8);
        //    
    	m1.start();
    	m2.start();
    	m3.start();
    	m4.start();
 
        //    
        m1.join();   //  join      ,        ,          。
        m2.join();
        m3.join();
        m4.join();
      
       System.out.println("   ,  ");
     
    }
 
}

    :

  :     !
  :     !
  :     !
  :    !
  :     !   :15 !
  :     !   :8 !
  :     !   :10 !
  :    !   :5 !
   ,  

ケース2カラオケ
package com.work.eight;

import java.lang.Thread;         
import java.util.Date;
class Box extends Thread{         //Box     
    private String boxNo;         //   
    private int  sec;             
    public Box(String boxNo, int sec){   //      
        this.boxNo =boxNo;
        this.sec =sec ;
     
    }
 
   //  run  
    public void run(){                   
        System.out.println(boxNo + "        !!!!");  //      
        try{                             //     
            Thread.sleep(sec*1000);      
        }
        catch(Exception e){
        }
        System.out.println(boxNo + "     ----");
    }
 
} 
//       (    )
 
class Waiter extends Thread {
    private String name;            
    private int idNo;
    private int  sec;
    public Waiter (String name ,int idNo,int sec){  //      
        this.name = name;
        this.idNo = idNo;
        
        
        this.sec = sec ;
    }
 
    //  run  
    public void run(){
    	//  1     
        while(true){
            try{
                System.out.println(idNo+"    "+name+"    ,       "+new Date());
                Thread.sleep(sec*1000);
            }
            catch(Exception e){
            }
        }
    }
 
}
 
 
class Demo2 {                             //  Demo 
    public static void main(String [] args){  
        Box bo1 = new Box("1",10) ;            //  3 box       waiter    
        Box bo2 = new Box("2",10) ;
        Box bo3 = new Box("3",5) ;
 
        Waiter w1 =new Waiter("Kistina",66,1);
        w1.setDaemon(true);    //        Thread.setDaemon(true);
        //          ,        
         
        bo1.start();                        
        bo2.start();
        bo3.start();
        w1.start();
    }
}


    :
1        !!!!
3        !!!!
2        !!!!
66      Kistina     ,       Thu May 17 10:29:54 CST 2016
66      Kistina     ,       Thu May 17 10:29:55 CST 2016
66      Kistina     ,       Thu May 17 10:29:56 CST 2016
66      Kistina     ,       Thu May 17 10:29:57 CST 2016
66      Kistina     ,       Thu May 17 10:29:58 CST 2016
3     ----
66      Kistina     ,       Thu May 17 10:29:59 CST 2016
66      Kistina     ,       Thu May 17 10:30:00 CST 2016
66      Kistina     ,       Thu May 17 10:30:01 CST 2016
66      Kistina     ,       Thu May 17 10:30:02 CST 2016
66      Kistina     ,       Thu May 17 10:30:03 CST 2016
1     ----
2     ----
66      Kistina     ,       Thu May 17 10:30:04 CST 2016

ケース3チケット販売
package com.work.eight;

class Saler extends Thread{          //        
    private String name ;            
    private static int tickets = 100 ; //              ,         100 
     
    private static Object lock = new Object() ;  //          lock  lock     
     
 
    public Saler(String name ){     //      
        this.name =name ;
    }
 
    public void run (){             //run  
        while(tickets >0){          //while   
     
            synchronized(lock) {    //                     
            int temp = tickets ;
            tickets = temp -1;
 
            System.out.println(name+":  :T"+temp);
            }
            yield();               //  ,   cpu              
            }
    }
 
 
}
 
class TicketDemo{                           
    public static void main (String[] args){
        Saler s1 = new Saler("  1");      
        Saler s2 = new Saler("  2");
 
        s1.start();
        s2.start();
 
 
    }
     
 
}

  (  ):

  1:  :T100
  1:  :T99
  1:  :T98
  1:  :T97
  2:  :T96
  2:  :T95
  2:  :T94
  2:  :T93

ジョブ:
1.5台の自動車が洞窟を通って、順番に洞窟を通った.各車は洞窟を通過するのに10秒かかり、マルチスレッドで実現します.
コード#コード#
package com.work.eight;


class  Car extends Thread{
	
	Hole hole =new Hole	("  ",1);
	
	private String brand;  //  
	
	private int carNo;  //  

	private int sec;       //     
	 
	public Car(int carNo,String brand,int sec){
		
		this.brand=brand;
		
		this.carNo=carNo;
		
		this.sec=sec;
		
	}
	
	public void run(){	
		
	  synchronized(hole){                     //     
      System.out.println("  "+carNo+"   "+brand+"    "+hole.getHolename()+"    "+hole.getHolelong()+"  ");
   
      try{
          Thread.sleep(sec*1000);
          System.out.println("  "+carNo+"   "+brand+"        "+sec+" !");
      }
      
      catch(Exception e){}
       
       
       
  }
		
	}

}
	
	class  Hole {
		
		private String  holename;    //    
		
		private int holelong;       //  
		
		public Hole(String  holename, int holelong){
			
			this.holename=holename;
			
			this.holelong=holelong;
			
		}

		public String getHolename() {
			return holename;
		}

		public void setHolename(String holename) {
			this.holename = holename;
		}

		public int getHolelong() {
			return holelong;
		}

		public void setHolelong(int holelong) {
			this.holelong = holelong;
		}
					
	}



class CrossHoleDemo{
	
	public static void main(String[] args) throws Exception{
	
		//    
        Car c1 = new Car(1,"  ",10);
        Car c2 = new Car(2,"  ",10);
        Car c3 = new Car(3,"    ",10);
        Car c4 = new Car(4,"   ",10);
        Car c5 = new Car(5,"   ",10);
        
        //           
        c1.start();
        c1.join();
         
        c2.start();
        c2.join();
        c3.start();
        c3.join();
        c4.start();
        c4.join();
        c5.start();
        c5.join();
		
	}
	
	
}

    :

  1               1  
  1             10 !
  2               1  
  2             10 !
  3                 1  
  3               10 !
  4                1  
  4              10 !
  5                1  
  5              10 !

2.
ミツバチと熊の関係をマルチスレッドでシミュレートした.
ミツバチは生産者で、熊は消費者です.ミツバチがハチミツを生産するのは積み重ねの過程であり、熊がハチミツを食べるのはロット(100いっぱい食べる)の過程である.
生産者と消費者の間では通知方式で相手に知らせる.デッドロックが発生しないように注意してください.
コード:
package com.work.eight;

class Bear extends Thread{
	
	private FengMi fengmi;
	
	private String bearname;
	
	
	public Bear(FengMi fengmi,String  bearname){
		
		this.fengmi=fengmi;
		
		this.bearname=bearname;
		
	}
	
	public void run(){
		

		
		while(true){
			
		synchronized(fengmi){
		
		if (fengmi.getFemgminum()<100) {
			
		try {
		
		fengmi.wait();
			
		}
		catch (Exception e){
			
		}
			
		}
		
		else if(fengmi.getFemgminum()>=100&&fengmi.getFemgminum()%100==0){
			
				fengmi.ChiFemgmi();
		
				System.out.println("100     "+bearname+"  ,  "+fengmi.getFemgminum()+"   ");
		
			try{
		
				fengmi.notifyAll();
				
			}
			
			catch(Exception e){
				
				
			}	
				
		}
		
		
		}
		
		yield();
	
	}
	
}

}


class FengMi {
	
	private static int femgminum=0; //       
	
	private  final int femgminumMax=500; //         

	public static int getFemgminum() {
		return femgminum;
	}


	public int getFemgminum1() {
		return femgminumMax;
	}
	
	public int getFemgminumMax() {
		return femgminumMax;
	}

	public void CreateFemgmi() { //    
		this.femgminum += 1;
	}
	
	public void ChiFemgmi() { //   
		this.femgminum -=100;
	}
	
}



class Bee extends Thread{
	
	private FengMi fengmi;
	
	private String  beename;
	
	
	public Bee(FengMi fengmi,String beename){
		
		this.fengmi=fengmi;
		
		this.beename=beename;
		
	}
	
	public void run(){
		
		int i=1;
		
		while(true){
			
		synchronized(fengmi){
			
		if(fengmi.getFemgminum()<fengmi.getFemgminumMax()&&fengmi.getFemgminum()>=0){
			
			
			if (fengmi.getFemgminum()%100==0){
				
			try{

			System.out.println("      ,    "+fengmi.getFemgminum()+"   ,      ");
			
			fengmi.CreateFemgmi();
			
			fengmi.notifyAll();
			
			Thread.sleep(50);
							
			}

			catch(Exception e){
				
			}
		
			}
			
			else {
				
			fengmi.CreateFemgmi();
				
			System.out.println("      ,    "+fengmi.getFemgminum()+"   ");
			
			try{
			
			fengmi.notifyAll();
			
			Thread.sleep(50);
				
			}
			
			catch(Exception e){
				
			}
			
			}
			
			
			
		}	
			
		else if(fengmi.getFemgminum()>=fengmi.getFemgminumMax()){
			
			System.out.println("    ");
			
			try{			
			
			fengmi.wait();
			
			}
			catch(Exception e){
				
			}
			
			}	
			
		}
		
		i++;
		
		yield();
		
		
		
		}
	
	}
	
}




class 	BeeBearModel{
	
	public static void main(String[] args){
		
		
		FengMi fengmi=new FengMi();
			
		Bear bear1=new Bear(fengmi,"Bear1");	
	
		 
		Bee bee=new Bee(fengmi,"Bee1");	

		bear1.start();
		
		
		bee.start();

		
	}
	
	
}

結果(部分):
ハチミツは採集して、現在全部で95個のハチミツ
ハチミツは採集して、現在全部で96個のハチミツ
ハチミツは採集して、現在全部で97個のハチミツ
ハチミツは採集して、現在全部で98個のハチミツ
ハチミツは採集して、現在全部で99個のハチミツ
ハチミツは採集して、現在全部で100個のハチミツ
100個のハチミツはBear 1に食べられ、残りは0個のハチミツ
ハチミツは採集して、現在全部で0個のハチミツ、熊は採集することができます
ハチミツは採集して、現在全部で2つのハチミツ
ハチミツは採集して、現在全部で3つのハチミツ
ハチミツは採集して、現在全部で4つのハチミツ
ハチミツは採集して、現在全部で5つのハチミツ