---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
今天复习的内容主要是多线程,这块知识点还是比较多的,主要有线程与进程的异同点、实现多线程的方法、对多线程操作的方法、线程的状态、多线程的同步、线程间的通信、线程生命周期等。
一、 线程与进程的异同:
1、同样作为基本的执行单元,线程是更小的指向单位,一个进程中可以有多个线程;
2、每个进程都有自己独立的内存区域,而线程却可以使共享内存单元,这样通过共享的内存单元来实现数据的实时通讯。
二、 实现多线程的方法:
1、通过继承Thread类实现多线程;
在定义的类中继承Thread并覆写Thread类的run()方法,把需要多线程的语句写在run()方法中。
在创建的对应类的实例中调用start()方法,启动了多线程。
2、通过实现Runnable接口实现多线程;
Runnable接口中只有一个run()抽象方法,因此要实现此方法,把需要多线程的语句写在run()方法中。
实例化这个类,创建对应对象,通过这个对象去实例化一个Thread类对象,之后调用start()方法启动多线程
三、 这两种多线程机制的比较:
1、查阅JDK发现Thread类实现了Runnable接口,
2、实现Runnable接口适合于相同程序代码的线程去处理同一资源
3、实现Runnable接口可以避免Java单继承的局限
4、代码与数据独立,增强健壮性;因此第二种方法使用更广泛。
四、对多线程操作的方法,常用的有:
getName()获取线程名称;setName()设置线程名称;isAlive()线程是否启动,返回boolean型值;sleep()静态方法用于线程休眠,可以设定休眠时间;interrupt()中断线程;
五、线程的状态:被创建、运行、冻结、阻塞、消亡
六、多线程的同步
1、问题的引出:当多线程操作的是某一共享数据,并且操作这一共享数据的语句不只一句,就有可能引发同步问题。产生的原因就是,当某个线程在这些语句中运行一半时,将执行权交给了同类的另外一个线程。这时这个共享数据就会出现不同步现象。只有把这些操作共享数据的语句的原子性,就是只要程序执行到这些语句,就要一直执行下去,不能让其他线程执行。
2、同步代码块与同步函数
同步代码块的锁是任意的对象,而同步函数的锁是this,静态同步函数的锁是this.getClass()
同步虽然解决了线程的安全问题,但是相对降低了效率,因为同步外的线程的都会判断同步锁,同步中必须有多个线程并使用同一个锁。
七、死锁:多个线程同时争用多个锁,就有可能出现死锁
如:线程1持有对象A上的锁,而且正在等待对象B上的锁;而线程2持有对象B上的锁,却正在等待对象A上的锁。那么这两个线程永远不会获取第二个锁,也不会释放第一个锁,这就出现了死锁。下面是死锁的实例:
package itcast;
public class DeadLock {
public static void main(String[] args) {
new Thread(new LockTest(true)).start();
new Thread(new LockTest(false)).start();
}
}
class LockTest implements Runnable{
private boolean flag;
LockTest(boolean flag){
this.flag = flag;
}
public void run() {
if(flag){
while(true){
synchronized (MyLock.locka) {
System.out.println(Thread.currentThread().getName()+"...if的locka锁");
synchronized (MyLock.lockb) {
System.out.println(Thread.currentThread().getName()+"...if的lockb锁");
}
}
}
}
else{
while(true){
synchronized (MyLock.lockb) {
System.out.println(Thread.currentThread().getName()+"...else的lockb锁");
synchronized (MyLock.locka) {
System.out.println(Thread.currentThread().getName()+"...else的locka锁");
}
}
}
}
}
}
class MyLock{
public static final Object locka = new Object();
public static final Object lockb = new Object();
}
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net