---------------------- android培训、java培训、期待与您交流! ----------------------
多线程机制是java语言的又一重要特征,使用多线程技术可以使系统同时运行多个执行体,这样可以加快程序的响应时间,提高计算机资源的利用率。使用多线程技术可以提高整个应用系统的性能。
一、多线程的实现
1、 通过Thread类实现多线程
通过继承Thread类实现多线程的方法是首先设计Thread的子类,然后根据工作需要重新设计线程的run( )方法,在使用start( )方法启动线程,将执行权转交到run( )方法中。
线程的代码段在run( )方法中,那么该方法执行完成以后线程也就相应的结束了,因而可以通过控制run( )方法中循环的条件来控制线程结束。
启动一个线程是用start( )方法,而不是run( )方法。看如下例子:
class Thread1 extends Thread
{
String name;
Thread1(String name)
{
this.name=name;
}
public void run( )
{
System.out.println(name+” is running!”);
}
public static void main(String [ ] args)
{
new Thread1(“A”).start( );
new Thread1(“B”).start( );
}
}
这是一个通过Thread类实现线程的例子,如果我们把start( )方法换成run( )方法,是无法启动线程的。
2、 通过Runnable接口实现多线程
通过Runnable接口实现多线程的方式是首先设计一个实现Runnable接口的类,然后根据工作需要重新设计线程的run( )方法;再建立该类的对象,以此对象为参数建立Thread类的对象;调用Thread类对象的start( )方法启动线程,将执行权转交到run( )方法。
这种方法可以避免由于java的单继承特性带来的局限性。如果一个类继承了一个非Thread类,而又需要使用多线程,由于它不能同时继承2个父类,这时就只能采用实现Runnable接口。
在实际应用中,几乎所有多线程的应用都可以采用Runnable接口方式。
二、线程的同步
Java提供了多线程机制,通过多线程的并发运行可以提高系统资源利用率,改善系统性能。但在有些情况下,一个线程必须和其他线程合作才能共同完成任务。线程可以共享内存,利用这个特点可以在线程之间传递信息。然而如果处理不当,对内存空间的共享可能会造成程序运行的不确定性和其他错误。这时就需要利用线程的同步来解决。
1、 同步代码块
把需要同步的代码放在同步代码块中:
synchronized(参数){}
2、 同步函数
在需要同步的函数前加synchronized修饰符,
如:public synchronized void run( ){}
3、 代码块和函数间的同步
因为在同步函数中synchronized调用的参数是this,因此只需要把同步代码块中的参数设置为this 即可实现代码块和函数间的同步。
4、 死锁
死锁是由于监视器一直处于运行状态,得不到释放造成的,在编写过程中要注意避免死锁问题
三、线程间的通信
线程同步很好地解决了数据的安全性问题,但是并不能控制线程的运行顺序,在通信的过程中有可能连续发送数据或连续接收数据,造成部分数据丢失或接收重复数据的情况,这里就需要用到几个方法。
wait( ):告诉当前线程放弃监视器并进入睡眠状态直到其他线程进入同一监视器并调用notify( )方法为止。
notify( ):唤醒同一对象监视器中调用wait( )的第一个线程。用于类似饭馆有一个空位后通知所有等待就餐的顾客中的第一位可以入座的情况。
notifyAll( ):唤醒同一对象监视器中调用wait( )的所有线程且有最高优先级的线程首先被唤醒并执行。用于类似某个不定期的培训班终于招生满额后,通知所有学员都来上课的情况。
利用这几个方法,在发送数据时,如果发现数据还未接收,则启动wait( )放弃监视器,直到数据接收被唤醒;在接收数据时,如发现数据是重复的,已经接收过,则进入wait( ),等待传送进入新的数据。
四、线程的生命周期
如图所示:
---------------------- android培训、java培训、期待与您交流! ----------------------