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

------- 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培训、期待与您交流! -------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值