第十一章 多线程


  1. 理解程序、进程、线程的概念

程序可以理解为静态的代码。

进程可以理解为执行中的程序。

线程可以理解为进程的近一步细分,程序的一条执行路径。


2.如何创建java程序的进程(重点)

方式一:继承于Thread类

①创建一个继承于Thread的子类

②重写Thread类的run()方法,方法内实现此子线程要完成的功能

③创建一个子类的对象

④调用线程的start():启动此线程,调用相应的run()方法

⑤一个线程只能够执行一次start

方式二:实现Runnable接口

①创建一个实现Runnable接口的子类

②重写Thread类的run()方法,方法内实现此子线程要完成的功能

③创建一个子类的对象

④创建一个Thread对象,并把子类对象作为形参传递进去,调用线程的start():启动此线程,调用相应的run()方法


两种方式的对比:

联系:class Thread implements Runnable  

实现的方式较好1.解决了单继承的局限性 2.若多个线程有共享数据,建议使用实现方式,同时,共享数据所在的类可作为Runnable接口实现的类

线程里常用的方法:start() run() currentThread() getName() setName(String name) yied() join() sleep() isAlive() getPriority() setPriority(int i);

                                  wait() notify() notifyAll()


3.线程的生命周期

新建 就绪 运行 阻塞 死亡


4.进程的同步机制(重点)

前提:如果我们创建多个线程,存在着共享数据,那么就有可能出现线程的安全问题:当其中一个线程操作共享数据时,还未操作完成,另外的线程就参与进来,导致对共享数据的操作出现问题

解决方式:要求一个线程操作共享数据时,只有当其完成操作完成共享数据,其它线程才有机会执行共享数据

方式一:同步代码块

synchornized(同步监视器){

//操作共享数据的代码

}

1.同步监视器:俗称锁,任何一个类的对象都可以充当锁,想要保证线程安全,必须要求所有的线程共用同一把锁

2.使用实现Runnable接口的方式创建多线程的话,同步代码块中的锁,可以考虑是this,如果使用继承Thread类的方式慎用this

3.共享数据:多个线程需要共同操作的变量。要明确哪部分是操作共享数据的代码。


方式二:同步方法:将操作共享数据的方法声明为synchornized

如:public synchronized void show(){//操作共享数据的代码}

1.对于非静态方法而言,使用同步的话,默认锁为:this。如果使用继承的方式实现多线程的话,慎用

2.对于静态的方法,如果使用同步,默认锁为:当前类本身


总结:释放锁:wait();

           不释放锁:sleep() yied() suspend()(过时,可能导致死锁)

死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁


5.进程的通信 如下的三个方法必须使用在同步代码块或同步方法中

wait():当在同步中执行到此方法,则此线程“等待”,直至其他线程执行notify()的方法,将其唤醒,唤醒后继续其wait()后的代码

notify() notifyAll():在同步中,执行到此方法,则唤醒其他的某一个或所有的被wait()的线程



第十二章 java常用类

1.String类:是一个final类,代表不可变的字符序列


String类与基本数据类型、包装类;与字符数组、字节数组的转化

①字符串--->基本数据类型、包装类:调用相应的包装类的parseXxx(String str);

②基本数据类型、包装类--->字符串:调用字符串的重载的vauleOf()方法

③字符串--->字节数组:调用字符串的getBytes()

④字节数组--->字符串:调用字符串的构造器

⑤字符串--->字符数组:调用字符串的toCharArray();

⑥字符数组--->字符串:调用字符串的构造器

⑦String--->StringBuffer:使用StringBuffer的构造器 newStringBuffer(StringBuffer str)

⑧StringBuffer--->String:使用StringBuffer的toString方法


   Stringbuffer类:可变的字符序列

   Stringbuild:可变的字符序列,jdk5.0新加,效率高,线程不安全

常用方法:添加append() 删除delete(int startIndex,int endIndex) 修改setCharAt(int n,char ch) 查询charAt(int index) 插入inset(int index,String str) 反转reverse() 长度length()


2.时间、日期类

①System类:currentTimeMillis():返回当前时间的long型值,此long值是从1970年1月1日0点0分00秒开始到当前的毫秒数。

                         常用来计算时间差。

②Date类:java.util.Date

   Date d = new Date();//返回当前时间的Date:Mon May 12 15:17:01 CST 2014

   Date d1 = new Date(15231512541241L);//返回形参处此long型值对应的日期

③SimpleDateFormat :java.text.SimpleDateFormat

   格式化:日期---->文本 使用SimpleDateFormat的format()方法

   解析:文本--->日期 使用SimpleDateFormat的parse()方法

④Calendar:日历类

获取实例:Calendar c = Calendar.getInstance();

                  get()/set()/add()/date  getTime()

3.Math类  了解

4.BigInteger BigDecimal类    了解