------- android培训、java培训、期待与您交流! ----------
一、多线程 :一个进程在执行过程中可以产生多条线程,这些线程可以同时存在,同时执行多个不同的程序块,形成多个执行线索,达到对同一个线程内的共享内存单元的同时并发执行的高效率的编程手法。
二、创建多线程:
1)继承Thread类,调用它的start()方法。
2)定义类实现Runnable接口,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数,调用Thread类的start方法开启线程,并调用Runnable接口子类的run方法。
三、实现Runnble接口与继承Thread类的区别:
1)、适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
2)、可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
3)、增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
2)、可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
3)、增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
所以,在定义线程的时候建议使用实现Runnable的方法。
四、线程中的常见的方法:
public static Thread currentThread();返回当前正运行的线程对象;
public final String getName();返回线程的名字;
public void destroy();销毁线程;
public void final join();等此线程结束后,在运行其他的线程;
public void final run();里面封装了线程运行的时候要执行的代码;
pulbic void final setName();设置线程的名称;
public static native void sleep(long millis);使线程休眠一定的时间片刻;
public void start();开启线程;
public static native void yield();临时中断线程,能保证CPU的平均分配;
五、1)多线程的安全隐患:
当多条语句在操作同一个线程中的共享数据时,一个线程对多条语句只执行了一部分,;还没执行完,另一个线程参与进来,导致共享数据的错误;
2)java的解决方式:同步代码块(synchronized)
…
synchronized(对象)
synchronized(对象)
{
需要同步的代码 ;
}
…
}
…
通过把那些操作共享数据的多条语句放在同步代码块中,在同一时刻i,只能有一个获得锁的线程进入同步代码块中执行,在执行过程中,其它没有获得锁的线程,即使获取 了CPU的执行权,也不能进来,来解决多线程带来的安全隐患。
3)sychronized修饰函数同样可以实现同步的效果,他的锁是this(执行语句的当前对象);而同步函数被静态修饰,因为静态进内存时,内存中没有本类对象,而有该字节码对应的字节码文件对象,所以,此时,它的锁是方法所在类的字节码对象——类名.class。
六、1)死锁:一旦有多个进程,且它们都要争用对多个锁的独占访问,那么就有可能发生死锁。如果有一组进程或线程,其中每个都在等待一个只有其它进程或线程才可以执行的操作,那么就称它们被死锁了。
2)解决方式:
要避免死锁,应该确保在获取多个锁时,在所有的线程中都以相同的顺序获取锁。
要避免死锁,应该确保在获取多个锁时,在所有的线程中都以相同的顺序获取锁。
七、线程之间的通信:多个线程在引用同一个实例各自运行不同的代码时,要达到实际的需求,往往需要对线程的运行状态进行调度,调用的方法:wait(),notify(),nitifyAll()。
八,线程停止的方法:1)把当前线程对象设置成空;2)为线程类设置一个布尔标志,定期检查该标志是否为真,如果想停止一个线程,就把该布尔值设置成空。3)run方法结束,控制住循环(停止线程提倡的方法)。