Java多线程
----------
android培训
、
java培训
、期待与您交流!----------
1、多线程的概念
由于计算机CPU计算速度很快,且具备分时机制,所以每个进程都能够循环获取自己的时间片,就像是多个程序在同时运行一样,多线程是并发执行的有效手段之一,多线程就是指一个进程在执行的时候可以产生多个更小的程序单元,这些线程单元可以同时存在、同时运行。
2、多线程的实现
Java中实现多线程有两种方法:
(1)继承Thread类
继承Thread的类必须覆写run()方法,并调用Thread类中得start()方法才能开启多线程,且start()方法只能调用一次。
该方法具有局限性,因为类不能多继承,所以继承了Thread类的子类不能再继承其他类。
(2)实现Runnable接口
通过实现Runnable接口也可以实现多线程,并打破了单继承的局限性,但是还需要依靠Thread类中的start()方法开启多线程
线程创建过程:
(1)
定义类实现Runnable接口
(2)覆盖接口中的run方法(用于封装线程要运行的代码)
(3)通过Thread类创建线程对象
(4)将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数
(5)调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法
使用Runnable的优势:
(1)适合多个相同程序代码的线程去处理同一资源
(2)避免单继承的局限性
(3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的
注意:
程序运行中至少有两个线程在运行,一个是主函数的主线程,另一个是垃圾回收的线程。
3、线程的状态
任何线程都一般具有5种状态:创建、就绪、运行、阻塞、死亡。
(1)新建:利用构造方法创建一个线程对象后,新的线程对象就处于新建状态
(2)就绪:调用该线程的start()方法就可以启动线程,当线程启动时处于就绪状态,等待进入线程队列
(3)运行:就绪的线程被调用并获得CPU资源时,线程进入运行状态,自动调用run()方法执行该线程的功能
(4)阻塞:在被人为挂起或者执行耗时的操作时,会暂停自己的操作进入阻塞状态,当阻塞原因被消除后重新进入就绪状态
(5)死亡:线程调用stop()方法或者run()方法执行结束后,线程即进入死亡状态,不再具有继续执行的能力
4、线程操作方法
由于Runnable接口中并没有对线程操作的方法,所以还是需要使用Thread类中的想关方法对对线程类进行操作。
(1)取得和设置线程名称:getName()与setName()
(2)判断线程是否启动:isAlive()
(3)线程的强制运行:join()
(4)线程休眠:sleep()
(5)中断线程:interrupt()
5、同步与死锁
一个多线程如果是通过Runnable实现的,那么类中的属性将被多个线程共享,
当多条语句在操作同一个共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,
另一个线程参与进来执行,就会导致共享数据的错误。
解决方法:
(1)同步代码块
synchronized(同步对象){
需要同步的代码
}
该方法中对象被加锁,加锁的线程可以在同步是执行,而其他线程即使获得了cpu执行权也不能够执行被加锁的代码块
缺点为耗费资源
(2)同步方法
synchronized 返回值 方法名称(参数列表){
执行代码
}
死锁:死锁是指两个线程都再等待对方先完成,造成了程序的停滞,一般程序的死锁都是在程序运行时出现的。
6、线程间通信
线程间通信就是说多个线程都在操作统一资源,但是操作的动作是不同的
资源的同步操作:生产者与消费者
如果想要生产者不重复生产,消费者不重复消费,则需要增加一个标志位,以及使用等待与唤醒机制
7、Lock接口
在升级为JDK1.5后,线程间同步通信问题得到了更好的解决,即出现了Lock接口,
Lock 替代了synchronized,
Condition 替代了 Object监视器方法。
---------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------