您的位置:首页 > 职场人生

黑马程序员_java多线程笔记Part I

2014-07-09 16:29 232 查看
------- android培训java培训、期待与您交流! ----------

创建线程

java中创建线程有两种方法。

1. 继承Thread类

步骤: 定义类继承Thread方法;复习Thread类的run()方法;创建该子类对象;调用start()方法开启线程。

2. 实现Runnable接口

步骤:

1) 定义类实现Runnable接口

2)覆盖Runnable接口中的run()方法

3) 通过Thread类建立线程对象

4)将Runnable接口子类对象作为实际参数传递给Thread类的构造函数

5)调用Thread类的start方法开启线程并调用Runnable接口子类的run()方法

为什么需要第二种方法?

因为java中只允许单继承,也就是每个类最多只能有一个父类。所以如果第一种方法中的子类已经有一个父类,那么它就不能再继承Thread类了

这里也体现了接口的设计哲理。

线程安全问题

多个线程在处理共享数据时,如果一个线程还没处理完,第二个线程获得cpu资源开始处理同一个数据,这样就会导致错误产生。

线程安全问题解决方案:同步代码块或者同步函数

同步代码块用在操作多个线程共享资源操作的代码上,如果整个函数都在操作这个共享资源,那么就可以给函数直接加synchronized修饰符,也就是同步函数。

同步需要一个锁,同步代码块中小括号中的对象就是一个锁,同步函数的锁是this,静态同步函数的锁是本类名.class对象。

需要同步的前提:1. 多个线程 2.多个线程使用同一个锁

经典的类比是:火车上上厕所,哈哈

<pre name="code" class="java">//同步代码块
synchronized(对象){
需要同步的代码
}

//同步函数
public synchronized void 函数名(){
需要同步的函数体
}


等待唤醒机制

方法:等待唤醒机制的方法有wait()、notify()、notifyAll()。只有同一个锁上的等待线程可以被同一个锁上的notify唤醒,锁就是前面提到的对象,是任意的,所以这些方法都定义在基类Object类中。

JDK1.5中提供了多线程升级解决方案:

1. 将同步Synchronized替换成现实Lock操作

2. 将Object中的wait,notify,notifyAll替换成了Condition对象。Condition对象中有await,signal,signalAll方法。

3. 该对象可以Lock锁对象的newCondition方法进行获取,而且可以获取多个。

比起Synchronized的优势:一个锁可以对应多个Condition对象,也就是多个等待唤醒机制。

经典例子:生产者和消费者问题。

线程停止

stop方法已过时,所以线程停止只有run方法结束。一般线程运行代码中都会有循环,所以一般要加入循环结束标记,进程才可能结束。

当线程处于冻结状态,就不会读到线程结束标记,那么线程就不会结束。也就是当线程都处于wait或者sleep时,没有指定的方式可以让冻结的线程恢复到运行状态,这时候就需要用interrupt方法对冻结状态进行清除,使线程强制进入运行状态,但会出现InterruptedException,在异常处理中设置循环结束标记,让线程结束。

线程结束还有另外的方式:守护线程。可以理解为后台线程,当主线程结束后,后台线程自动结束。也就是说当当前活动的线程都是守护进程时,java虚拟机退出,程序结束。

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息