Java基础--多线程
2015-06-17 15:23
429 查看
1.什么是线程
一个程序可以同时执行多个任务,通常每一个任务称为一个线程。
多线程和多进程的区别:每个进程拥有自己一整套变量,而线程共享数据。
创建线程的简单过程
注2:不要调用run方法,而应该调用Thread.start方法,start方法将创建一个执行run方法的线程。
2.中断线程
Interrupt方法可以请求终止线程。调用interrupt方法时,线程的中断状态(boolean)将被置位。
当线程处于sleep或wait状态(阻塞状态)时调用interrupt方法,会抛出InterruptedException异常。
线程中断interrupted() 和 isInterrupted()区别:
interrupted() //静态方法,用于检测线程是否中断,检测后会清除线程的中断状态
isInterrupted() //实例方法,检测线程是否中断,不会清除线程中断状态。
InterruptedException异常应该尽量抛出,让调用者捕获。或者在catch中设置为中断(Thread.currentThread().interrupt()),让调用者可以进行检测。
3. 线程状态
6种: 新创建(New)、可运行(Runnable)、被阻塞(Blocked)、等待(Waiting)、计时等待(Timed Waiting)、被终止(Terminated)
注:1.可运行状态的线程可能在运行,也可能没有运行。具体的线程调度依赖于操作系统(抢占式调度、协同调度等)
2. 线程终止原因 1)run方法正常运行结束 2)一个没有捕获的异常终止了run方法。
4.同步
两种机制防止代码块受并发访问的影响:Synchronized关键字和ReentrantLock类
当一个线程拥有某个条件的锁时,它仅仅可以在该条件上调用await,signalAll或signal方法。
锁和条件的关键点:
锁用来保护代码段,任何时候只有一个线程执行被保护的对象。
锁可以管理试图进入被保护代码段的线程
锁可以拥有一个或多个相关条件
每个条件对象管理进入被保护代码段但还不能执行的线程
===============================================
如果一个方法是用Synchronized关键字声明,那么对象的锁将保护整个方法。
1)不能中断一个正在试图获得锁的线程
2)试图获得锁时,不能设定超时
3)每个锁仅有单一条件
编程建议:
1)不要既不使用Lock/Condition也不适用synchronized关键字。
2)尽量使用synchronized关键字,除非特别需要Lock/Conidtion的独有特定时候。
一个程序可以同时执行多个任务,通常每一个任务称为一个线程。
多线程和多进程的区别:每个进程拥有自己一整套变量,而线程共享数据。
创建线程的简单过程
1)将任务代码移到实现Runnable接口的类的run方法。 class MyRunnable implements Runnable { public void run() { //task code } } 2)创建一个类对象 Runnable r = new MyRunnable(); 3) 创建一个Thread对象 Thread t = new Thread(r); 4)启动线程 t.start();也可以通过构件一个Thread类的子类定义一个线程,然后构建一个子类对象,并调用start方法
class MyThread extends Thread { public void run() { //task code } }注1:这种方法已不再推荐,应该从机制上减少需要并行的任务数量。如果任务过多,可以使用线程池。
注2:不要调用run方法,而应该调用Thread.start方法,start方法将创建一个执行run方法的线程。
2.中断线程
Interrupt方法可以请求终止线程。调用interrupt方法时,线程的中断状态(boolean)将被置位。
当线程处于sleep或wait状态(阻塞状态)时调用interrupt方法,会抛出InterruptedException异常。
线程中断interrupted() 和 isInterrupted()区别:
interrupted() //静态方法,用于检测线程是否中断,检测后会清除线程的中断状态
isInterrupted() //实例方法,检测线程是否中断,不会清除线程中断状态。
InterruptedException异常应该尽量抛出,让调用者捕获。或者在catch中设置为中断(Thread.currentThread().interrupt()),让调用者可以进行检测。
3. 线程状态
6种: 新创建(New)、可运行(Runnable)、被阻塞(Blocked)、等待(Waiting)、计时等待(Timed Waiting)、被终止(Terminated)
注:1.可运行状态的线程可能在运行,也可能没有运行。具体的线程调度依赖于操作系统(抢占式调度、协同调度等)
2. 线程终止原因 1)run方法正常运行结束 2)一个没有捕获的异常终止了run方法。
4.同步
两种机制防止代码块受并发访问的影响:Synchronized关键字和ReentrantLock类
Private Lock bankLock = new ReentrantLock(); pbulic void transfer(){ bankLock.lock(); //code bankLock.unlock(); }条件锁
当一个线程拥有某个条件的锁时,它仅仅可以在该条件上调用await,signalAll或signal方法。
bankLock = new ReentrantLock(); sufficientFunds = bankLock.newCondition(); //返回一个与锁相关的条件对象 bankLock.lock(); //... sufficientFunds.await(); //... sufficientFunds.signalAll(); //... bankLock.unlock();Synchronized关键字
锁和条件的关键点:
锁用来保护代码段,任何时候只有一个线程执行被保护的对象。
锁可以管理试图进入被保护代码段的线程
锁可以拥有一个或多个相关条件
每个条件对象管理进入被保护代码段但还不能执行的线程
===============================================
如果一个方法是用Synchronized关键字声明,那么对象的锁将保护整个方法。
public synchronized void method(){ //... wait(); //.... notifyAll(); }内部锁的一些局限:
1)不能中断一个正在试图获得锁的线程
2)试图获得锁时,不能设定超时
3)每个锁仅有单一条件
编程建议:
1)不要既不使用Lock/Condition也不适用synchronized关键字。
2)尽量使用synchronized关键字,除非特别需要Lock/Conidtion的独有特定时候。
相关文章推荐
- Eclipse代码编辑器配置
- Eclipse快捷键
- resin安装配置
- java 线程安全
- Spring整合JMS(一)——基于ActiveMQ实现
- Java —— 性能优化
- eclipse怎样生成javadoc
- Spring的数据源配置 DBCP、C3P0、BoneCP
- Eclipse快捷键大全
- 在JAVA中怎么比较Double类型数据的大小?
- spring.net应用
- Eclipse Java注释模板设置详解
- java 集合
- 配置Eclipse支持java和xml文件的代码补全功能
- java反射 反射构造函数 报 wrong number of arguments 错误
- 删除链表中重复的结点JAVA
- java-String类intern()方法
- JAVA->JNI 传递字符串数组
- Java操作HTML格式字符串的标签和属性
- Java Keytool使用方法