设为首页收藏本站

小牛社区-大数据学习交流社区|大数据免费学习资源

 找回密码
 立即注册!

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 184|回复: 0

【教程分享】bigdata_14期_20161006_第二十五天_小牛学堂_java_...

[复制链接]

76

主题

82

帖子

248

积分

吃土小白

Rank: 1

积分
248

精英训练营13期精英训练营14期精英训练营15期

发表于 2016-10-11 21:53:20 | 显示全部楼层 |阅读模式
----------------------------------------------------------
版板所有:小牛学堂
官网:http://www.edu360.cn
----------------------------------------------------------

百度网盘下载
链接: http://pan.baidu.com/s/1dENKl6x 密码: p9fi


内容回顾
1、 程序和进程;一个是静态的,存储在硬盘上;一个是动态的,运行在内存中;
2、 进程中的线程;一个进程中可以有多个同时执行的程序流,也称为一条执行线索,每条执行线索就称为一个线程;这样的程序,称为多线程程序;
3、 在现今的几乎所有的操作系统中,都支持多线程;几乎所有的强类型语言,也都支持多线程,包括C++;
4、 多个进程之间,他们不共享内存,也不共享数据;进程之间在一般情况下不会互相影响;
5、 线程的三要素;
a)   CPU;什么时间做;
b)   数据;做什么;
c)   代码;怎么做;  news,新闻; N,E,W,S; 东、南、西、北发生的事;
6、 线程启动;新建线程对象,不是调用子类或Runnable接口中的run方法,而是执行Thread类中提供的start()方法;当一个线程对象调用start方法启动之后,并不会马上运行;而是进入可运行状态,做大量的准备工作;在一个进程中,可能会有多个线程对象同时进入可运行状态,只有当某一个线程被CPU挑选(操作系统调度),获取CPU的执行权,才会进入运行状态;正常情况下,当这个线程对象执行完run方法中的所有代码,会终止线程的运行,进入死亡状态;
7、 在线程的三个要素中,CPU是不能共享的;因为同时,一个CPU只能为一个线程对象提供运行服务;而代码和数据则可以共享,也可以不共享,根据两者是否可共享的关系,可将线程分为四种模式;
a)   代码和数据都不共享;
b)   代码共享,数据不共享;
以上两种模式不重要,因为线程之间没有交互,所以既不存在“同步安全”问题,也不存在“线程通信”问题;
c)   代码和数据都共享的情况;这种情况会出现“线程同步”问题;为什么出现同步问题?
             i.     当多个线程对象“并发”操作相同的代码和数据,在一个线程对象没有完成时,会出现CPU被另一个线程抢占的情况,这样的话,可能会对共同的数据进行不同的更改,会导致共享数据的不一致状态,使得操作出现偏差;
           ii.     解决方式;将共享的某段代码做成“原子的”,使得当一个线程对象操作这个代码块时,不会有另一个线程对象打扰;
          iii.     有两种解决办法;
1.  同步代码块(用统一的锁)
2.  同步方法(实例同步方法时,当前对象this为锁;静态同步方法时,所在类.class为锁)
8、 创建线程对象的两种方式;
a)   继承Thread类,做为Thread类的子类,子类自然也为线程类;
b)   实现Runnable接口的类,做为Thread类构造器中的参数,生成线程对象;
9、 创建线程时使用Runnable接口,有何优势?
a)   实现接口的类,做为多个线程对象的共享资源;从另一个角度上来说,也是共享代码和数据;
b)   将代码实现与接口做分离,达到高内聚和低耦合的效果;
c)   避免Java中不支持多继承的缺陷,线程类可以在单继承的情况下进行多实现;
Xml的读的情况
Xml的写的情况
    使用若干个类对象,直接生成xml文件;使用json技术;
    用到的三个类NameAddressStudent
  
package  com.gao.cc.data;
  
import  lombok.Getter;
  
import  net.sf.json.JSONObject;
  
@Getter
  
public  class Name {
  
    private String firstName;
  
    private String lastName;
  
    @Override
  
    public String toString() {
  
       return  JSONObject.fromObject(this).toString(4);
  
    }
  
    public Name setFirstName(String firstName)  {
  
       this.firstName = firstName;
  
       return this;
  
    }
  
    public Name setLastName(String lastName) {
  
       this.lastName = lastName;
  
       return this;
  
    }
  
}
  
  
package  com.gao.cc.data;
  
import  lombok.Getter;
  
import  net.sf.json.JSONObject;
  
@Getter
  
public  class Address {
  
    private String province;
  
    private String city;
  
    private String street;
  
    private int number;
  
    @Override
  
    public String toString() {
  
       return  JSONObject.fromObject(this).toString(4);
  
    }
  
    public Address setProvince(String  province) {
  
       this.province = province;
  
       return this;
  
    }
  
    public Address setCity(String city) {
  
       this.city = city;
  
       return this;
  
    }
  
    public Address setStreet(String street) {
  
       this.street = street;
  
       return this;
  
    }
  
    public Address setNumber(int number) {
  
       this.number = number;
  
       return this;
  
    }
  
}
  
  
package  com.gao.cc.data;
  
import  java.io.Serializable;
  
import  lombok.Getter;
  
import  net.sf.json.JSONObject;
  
@SuppressWarnings("serial")
  
@Getter
  
public  class Student implements Serializable {
  
    private int age;
  
    private double height;
  
    private String sex;
  
    private Name name;
  
    private Address address;
  
    @Override
  
    public String toString() {
  
       return  JSONObject.fromObject(this).toString(4);
  
    }
  
    public Student setAge(int age) {
  
       this.age = age;
  
       return this;
  
    }
  
    public Student setName(Name name) {
  
       this.name = name;
  
       return this;
  
    }
  
    public Student setAddress(Address address)  {
  
       this.address = address;
  
       return this;
  
    }
  
    public Student setSex(String sex) {
  
       this.sex = sex;
  
       return this;
  
    }
  
    public Student setHeight(double height) {
  
       this.height = height;
  
       return this;
  
    }
  
}
  
    测试写文件;
  
package  com.gao.cc.demo;
  
import  java.util.ArrayList;
  
import  java.util.List;
  
import  net.sf.json.JSON;
  
import  net.sf.json.JSONArray;
  
import  net.sf.json.xml.XMLSerializer;
  
import  org.sunzone.util.My;
  
import  com.gao.cc.data.Address;
  
import  com.gao.cc.data.Name;
  
import  com.gao.cc.data.Student;
  
public  class Gao01 {
  
    public static void main(String[] args) {
  
       /*
  
        * 生成两个Student对象,存放在List中;
  
        */
  
       List<Student> students = new  ArrayList<Student>() {
  
           private static final long  serialVersionUID = -2165964025193815128L;
  
           {
  
              add(new Student()
  
                     .setAge(My.random(16,  30))
  
                     .setHeight(1.72)
  
                     .setSex("")
  
                     .setName(new  Name().setFirstName("二狗").setLastName(""))
  
                     .setAddress(
  
                            new  Address().setProvince("山西省").setCity("大同市")
  
                                   .setStreet("小店区").setNumber(112)));
  
              add(new Student()
  
                     .setAge(My.random(16,  30))
  
                     .setHeight(1.72)
  
                     .setSex("")
  
                     .setName(new  Name().setFirstName("").setLastName(""))
  
                     .setAddress(
  
                            new  Address().setProvince("山东省").setCity("济南市")
  
                                   .setStreet("不知道区").setNumber(78)));
  
           }
  
       };
  
       /*
  
        * List中的元素写入到一个xml文件中;
  
        */
  
       XMLSerializer xml = new  XMLSerializer();
  
       xml.setRootName("students");
  
       JSON json =  JSONArray.fromObject(students);
  
       String res = xml.write(json);
  
       System.out.println(res);
  
    }
  
}
  
    通过修改,最后得到的文件;
file:///C:/Users/hadoop/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
作业
    四个窗口售票;
    第一个版本,利用Thread类的子类;
  
package  com.gao.cc.demo;
  
import  org.sunzone.util.My;
  
public  class Gao02 {
  
    public static void main(String[] args) {
  
       Thread t1 = new SaleTickets();
  
       t1.setName("1窗口-");
  
       Thread t2 = new SaleTickets();
  
       t2.setName("2窗口--");
  
       Thread t3 = new SaleTickets();
  
       t3.setName("3窗口---");
  
       Thread t4 = new SaleTickets();
  
       t4.setName("4窗口----");
  
       Thread t5 = new SaleTickets();
  
       t5.setName("5窗口-----");
  
       t1.start();
  
       t2.start();
  
       t3.start();
  
       t4.start();
  
       t5.start();
  
    }
  
}
  
class  SaleTickets extends Thread {
  
    private static int tickets = 50;
  
    @Override
  
    public void run() {
  
       while (tickets > 0) {
  
           synchronized (SaleTickets.class) {
  
              if (tickets < 1) {
  
                  break;
  
              }
  
              String name =  Thread.currentThread().getName();
  
              try {
  
                  Thread.sleep(My.random(150));
  
              } catch (InterruptedException e)  {
  
                  e.printStackTrace();
  
              }
  
              System.out.println(name + "  售出: " + tickets--);
  
           }
  
       }
  
    }
  
    public static synchronized void sales() {
  
    }
  
}
  
    第二个版本,利用Runnable接口;
  
package  com.gao.cc.demo;
  
public  class Gao03 {
  
    public static void main(String[] args) {
  
       Runnable rt = new Sales();// 利用多个线程对象操作这同一份资源;
  
       Thread t1 = new Thread(rt, "1窗口-");
  
       Thread t2 = new Thread(rt, "2窗口--");
  
       Thread t3 = new Thread(rt, "3窗口---");
  
       Thread t4 = new Thread(rt, "4窗口----");
  
       t1.start();
  
       t2.start();
  
       t3.start();
  
       t4.start();
  
    }
  
}
  
class  Sales implements Runnable {
  
    private int tickets = 50;
  
    @Override
  
    public void run() {
  
       while (tickets > 0) {
  
           synchronized (Sales.class) {
  
              if (tickets < 1) {
  
                  break;
  
              }
  
              try {
  
                  Thread.sleep(30);
  
              } catch (InterruptedException e)  {
  
                  e.printStackTrace();
  
              }
  
              System.out.println(Thread.currentThread().getName()  + " sales "
  
                     + tickets--);
  
           }
  
       }
  
    }
  
}
  
    输出略;
    课堂作业
    创建两个线程,一个用于读取一个源文件,写入另一个目标文件;一个用于读取一个姓名和一个年龄,并输出;
线程通信
    前面的同步(同步代码块和同步方法),解决的是:不同线程对象使用相同代码操纵相同数据的安全问题;
    Java中的线程只解决两类问题;
1、 同步问题;相同代码,相同数据;售票示例;
2、 通信问题;不同代码,相同数据;图片的上传下载问题;
生产者和消费者
    理解;
    某个正在运行的线程,调用了wait方法,则将退出锁,进入等待池等待;当正在等待的线程通过其他线程的notifly方法所唤醒后,它并不会直接运行;而是到它所对应的原对象锁(锁池)所在的锁池中,寻找锁;当获取锁后,它也只能进入可运行状态,和正在等待的其他线程一样,想重新获取CPU,重新运行;
file:///C:/Users/hadoop/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册!

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册!

本版积分规则

快速回复 返回顶部 返回列表