黑马程序员技术交流社区
标题:
多线程小结
[打印本页]
作者:
杜弦东.
时间:
2015-7-6 16:34
标题:
多线程小结
4.多线程
4.1.什么是API
API全名:Application Programming Interface,API是应用程序编程接口,指一些预先定义好的类。
例如我们想要一台电脑,并不需要自己生产每个零件,只要从各个厂商买到组装电脑的零件就可以,然后根据说明书学会使用,将零件安装在一起就得到了电脑。电脑就像是我们要的程序,而零件就是API,说明书就是帮助文档。
4.2.Java API
Java API就是Sun公司提供给我们使用的类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用。
我们可以通过查帮助文档来了解Java提供的API如何使用
4.3.Java中常用API
String类
对字符串进行操作通常我们使用String类,相关的还有StringBuffer和StringBuilder
集合类
集合是一种容器,用来存取对象(Collection、Map)
包装类
Java定义了一组包装类对基本数据类型进行了包装(Integer、Double、Boolean)
时间类
Java定义了一些类方便用户对时间、日期进行处理(Date、Calendar)
系统类
Java定义了一些类针对系统进行操作(System、Runtime)
IO流
Java定义了一些类对数据传输进行了封装(输入输出流、File文件对象)
Socket
Java定义了一些类方便用户进行网络编程(Socket、DatagramSocket)
4.4.多线程概念
线程与进程
进程就是一个运行中的程序。
一个进程中可以有多个线程,线程是CPU调度和分派的基本单位。我们可以理解为线程就是程序运行中的一条路径。
多线程存在的意义
允许多个线程并发执行,提高程序运行效率。
例如:迅雷多线程下载,QQ多个人同时聊天,凌波多个人同时共享屏幕。
4.5.线程的使用
创建线程有两种方式
自定义一个类继承Thread类,将线程要做的事写在run()方法中,由于子类可以当父类来用,创建自定义子类对象就是创建了一个线程。
自定义一个类实现Runnable接口,将要做的事写在run()方法中。创建Thread对象时在构造函数中传入Runnable实现类对象。
线程的启动
两种创建方式都是调用Thread对象的start()方法。
当调用start()方法时,CPU会开启一条新线程,并在新线程上执行run()方法。
线程常用方法
currentThread
静态方法,用来获取当前线程
getName、setName
用来获取、设置当前线程的名字
sleep
控制线程休眠,单位为毫秒
setDaemon
将线程设置为守护线程。线程默认是非守护线程,守护线程不能单独执行。
join
当前线程暂停,等待加入的线程运行结束,当前线程继续执行。
4.6.多线程同步
线程安全问题
多线程并发访问同一数据,有可能出现线程安全问题。
一条线程的访问还没有结束,CPU切换到另一条线程工作,导致数据访问出错。
使用同步解决线程安全问题
使用同步代码块synchronized(锁对象){需要同步的代码...}形式将访问数据的代码锁住,在同步代码块中的内容同一时间内只能一个线程执行。
使用同步方法,用synchronized修饰方法,整个方法的代码都是同步的,只能一个线程运行。同步方法使用this作为锁。
死锁
在多个线程并发执行使用多个锁来同步时,有可能互相冲突,导致程序无法继续执行。
同步的优点与缺点
同步可以解决多个线程同时访问一个共享数据的问题,只要加上同一个锁,在同一时间内只能有一条线程执行。
在执行同步代码时每次都会判断锁,非常消耗资源,效率较低。
4.7.多线程通信
在同步代码中可以使用锁对象的wait()方法让当前线程等待
使用锁对象的notify()方法可以将正在等待的线程唤醒
如果多个线程都在等待,notify()唤醒随机1个
notifyAll()方法可以唤醒所有在等待的线程
4.8.JDK5之后的线程同步与通信
同步
使用java.util.concurrent.locks.Lock接口的实现类对象来进行同步
ReentrantLock就是Lock的实现类,可以实现synchronized的功能
在需要同步的代码块前后使用lock()和unlock()方法来完成同步
unlock()最好放在finally中,因为如果上面代码抛出异常没有解锁的话,会导致其他线程无法运行,程序卡死。
通信
使用Lock对象的newCondition()方法获取一个Condition对象,Condition对象可以控制指定线程的等待与唤醒。
await()方法可以控制线程等待。
signal()方法可以唤醒等待的线程。
signalAll()方法可以唤醒所有等待线程。
作者:
杜弦东.
时间:
2015-7-6 16:44
一个人都没有?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2