您的位置:首页 > 编程语言 > Java开发

Java基础--多线程

2015-06-17 15:23 429 查看
1.什么是线程

一个程序可以同时执行多个任务,通常每一个任务称为一个线程。

多线程和多进程的区别:每个进程拥有自己一整套变量,而线程共享数据。

创建线程的简单过程

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的独有特定时候。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: