大数据第八天内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数据第八天内容相关的知识,希望对你有一定的参考价值。

笔记:

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长时间时间一旦,自动唤醒。

线程安全:增加了同步处理。确保在同一时刻,只有一个线程执行同步代码。

同步方法使用的当前对象作为同步对象。


        守护线程:

        daemon                 setDaemon(true); //线程启动前设置

        

        

        同步代码块

        private static Object lock = new Object(); 

        // 创建一个静态对象lock,lock 是锁旗标

        synchronized(lock){}     

        //在此范围的进程同步执行 ,保证一段代码在一段时间只能有一个线程在同一执行

        synchronized             

        //同步函数 使用的锁旗标就是当前对象----this 


        线程安全:  

        synchronized     

             增加了同步处理。确保在同一时刻,只有一个线程执行同步代码。

             同步方法使用的当前对象作为同步对象。

             静态方法可以加同步处理,使用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  KTV

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 个蜂蜜被Bear1吃掉,剩余0个蜂蜜

蜂蜜采集好了,目前一共0个蜂蜜,熊可以来采了

蜂蜜采集好了,目前一共2个蜂蜜

蜂蜜采集好了,目前一共3个蜂蜜

蜂蜜采集好了,目前一共4个蜂蜜

蜂蜜采集好了,目前一共5个蜂蜜


本文出自 “11138113” 博客,请务必保留此出处http://11148113.blog.51cto.com/11138113/1775005

以上是关于大数据第八天内容的主要内容,如果未能解决你的问题,请参考以下文章

Mysql第八天 分区与分表

每日一算法|堆排序---第八天

Mysql第八天,优化SQL步骤

第八天内容

团队冲刺第八天

IT十八掌作业_java基础第八天_多线程