第十一章 多线程
理解程序、进程、线程的概念
程序可以理解为静态的代码。
进程可以理解为执行中的程序。
线程可以理解为进程的近一步细分,程序的一条执行路径。
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类 了解
本文出自 “阿成的博客” 博客,转载请与作者联系!