大数据第八天内容

笔记:

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个蜂蜜

时间: 2024-08-26 17:59:07

大数据第八天内容的相关文章

2019年,该怎样去系统学习大数据,知识+内容+教程

大数据作为2019年比较热门的技术,受到越来越多的关注,那么对于一个想进入大数据的朋友来说,最想知道的是:大数据学什么?今天科多大数据就和你们一起来分享一篇关于大数据学习内容体系介绍的文章. 大数据技术体系太庞杂了,基础技术覆盖数据采集.数据预处理.分布式存储.NOSQL数据库.多模式计算(批处理.在线处理.实时流处理.内存处理).多模态计算(图像.文本.视频.音频).数据仓库.数据挖掘.机器学习.人工智能.深度学习.并行计算.可视化等各种技术范畴和不同的层面.另外大数据应用领域广泛,各领域采用

大数据云计算学习内容

Linux大纲 1.Linux的介绍,Linux的安装:VMware Workstation虚拟软件安装过程.CentOS虚拟机安装过程 2.了解机架服务器,采用真实机架服务器部署linux 3.Linux的常用命令:常用命令的介绍.常用命令的使用和练习 4.Linux系统进程管理基本原理及相关管理工具如ps.pkill.top.htop等的使用: 5.Linux启动流程,运行级别详解,chkconfig详解 6.VI.VIM编辑器:VI.VIM编辑器的介绍.VI.VIM扥使用和常用快捷键 7.

大数据第九天内容

笔记部分: 创建线程方式 ----------------- 1.Thread 2.Runnable{public void run();} class Man extends Person implements Runnable{ public void run(){ ... } } new Car().start(); new Thread(new Man()).start(); eclipse --------------- alt + ///代码辅助 alt + 上箭头//向上移动一行

决胜大数据时代:Hadoop&amp;Yarn&amp;Spark企业级最佳实践(8天完整版脱产式培训版本)

Hadoop.Yarn.Spark是企业构建生产环境下大数据中心的关键技术,也是大数据处理的核心技术,是每个云计算大数据工程师必修课. 课程简介 大数据时代的精髓技术在于Hadoop.Yarn.Spark,是大数据时代公司和个人必须掌握和使用的核心内容. Hadoop.Yarn.Spark是Yahoo!.阿里淘宝等公司公认的大数据时代的三大核心技术,是大数据处理的灵魂,是云计算大数据时代的技术命脉之所在,以Hadoop.Yarn.Spark为基石构建起来云计算大数据中心广泛运行于Yahoo!.阿

大数据学习怎么样

大数据已经成为不可阻挡的时代潮流,伴随着大数据时代的到来也产生了一些相应的培训机构,各种各样的培训机构都出现了,这时候大多数人都有了一个疑惑,那就是培训机构到底哪家才好?该怎么选择才不会做错路,进错门.今天我帮大家分析一下大数据培训机构应该怎么来选择,要注意哪些方面. 千锋教育深度破译趋势密码,高在起点赢在前沿,开发大数据引领群雄,一流的技术让我们不得不服. 从技术层面看,千锋教育紧贴行业发展,着眼未来需求,开发.收集.储存.计算一站到底,爬虫技术挖掘数据价值,直击大数据核心,助攻求职竞争力,让

【51CTO学院三周年】大数据,让我找到了继续努力的方向

时间都去哪了? --记我将要到来的工作四周年 不知不觉间,工作马上就要满四周年了.从初出校门的楞小伙,变成了人夫,也即将成为人父,总是会感叹,"时间都去哪了?" 还记得刚工作那时,每天上班都很煎熬,领导分配的工作,很多东西都不会,需要请教项目组的其他同事,有时候,老是请教别人觉得很简单的问题,也会让自己觉得很脸红.所以,自己就告诉自己,一定要自己好好努力,多学习,多看书.慢慢的,买的书越来越多,会的东西也也来越多了.从每天写代码的小弟,也转变成了管理和写代码兼顾的项目经理. 虽然现在工

上海Cloudera Hadoop大数据培训:CCAH、CCP:DE

上海Cloudera Hadoop大数据培训:CCAH.CCP:DE 北京.上海.广州长期开班 3月上海开班时间:管理员(3月1-4日):开发者(3月23-26日) [其他课程安排请咨询]15000519329(陈老师) QQ群:Cloudera大数据 478790619 课程内容: [Cloudera Apache Hadoop管理员课程] 课时:4天 学习系统管理的概念和Apache Hadoop的最佳实践, 从安装和配置到负载均衡和调优. 这个4天的的课程通过动手时间来赋予你部署的经验,

决胜大数据时代:Hadoop&amp;Yarn&amp;Spark企业级最佳实践(3天)

Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. Yarn是目前公认的最佳的分布式集群资源管理框架: Mahout是目前数据挖掘领域的王者:        工业和信息化部电信研究院于2014年5月发布的“大数据白皮书”中指出: “2012 年美国联邦政府就在全球率先推出“大数据行动计划(Big data initiative)”,重点在基础技术研究和公共部门应用上加大投入.在该计划支持下,加州大学伯克利分校开发了完整

大数据分析师培训项目

摘要:Big Data“大数据”是继云计算.物联网之后IT产业又一次颠覆性的技术变革.对国家治理模式.对企业的决策.组织和业务流程.对个人生活方式都将产生巨大的影响.美国将大数据提升为国家战略,中国虽然还没有明确提出,但已经把大数据上升为与国防一样的高度.我国政府对大数据的敏感度快速提高,并正在采取措施.所以说,中国已经步入大数据时代,这种重视是由政府层面自上而下进行普及的,可能还未普及到普通百 大数据分析师培训项目 课程背景 Big Data“大数据”是继云计算.物联网之后IT产业又一次颠覆性