我自己对线程一章的总结:
1、线程与进程:
1、线程是进程的组成部分,一个进程可以拥有多个线程
2、一个程序运行后至少有一个进程,一个进程可以包含多个线程,但至少包含一个线程
3、线程是独立运行的
4、进程之间不能共享内存,但线程之间共享内存非常容易
2、线程的创建和启动:
1、继承Thread类:继承Thread的对象直接创建的实例就可以代表线程对象
2、实现Runnable接口:实现Runnable接口的对象仅仅作为Thread对象的target,而实际的线程对象依然是Thread实例,所以采用Runnable接口的方式来创建的多条线程可以共享线程类的实例属性
3、区别:
1、方式1已经继承Thread类,不能在继承其他父类,方式2只是实现Runnable接口,还可以继承其他类。
2、方式1直接使用this就可获得当前线程,而方式2如果需要访问当前线程,必须使用Thread.currentThread()方法
3、方式2 可以多个线程共享一个target对象,非常适合多个线程之间共享资源
3、run()和start()
1、run()方法中的代码代表了线程需要执行的任务,run方法称为线程执行体。
2、线程调用start()方法启动线程,线程进入就绪状态,表示该线程可以运行了,不一定立即运行,至于该线程何时运行,取决于JVM里的线程调度,
3、如果直接调用线程对象的run()方法,run方法会立即执行,在run方法返回之前,其他线程都无法并发执行,此时的run方法只是一个普通方法,不是线程执行体,所以此时不能在run方法里直接通过getName()方法获得当前执行线程的名称
4、main方法的方法体代表主线程的线程执行体,所以一个main方法中至少有一条线程
5、线程的生命周期
1、线程生命周期要经过新建、就绪、运行、阻塞、死亡五种状态
2、线程调用start方法进入就绪状态
3、线程进入阻塞状态:
1、线程调用sleep方法
2、线程调用阻塞式IO方法
3、等待其他线程释放同步监视器
4、线程在等待某个通知(notify)
5、调用suspend方法线程挂起(但不会是否同步锁),不过这个方法容易导致死锁,所以程序应该尽量避免使用该方法
4、线程从阻塞状态重新进入就绪状态
1、调用的sleep方法的线程经过了指定的时间
2、线程调用的阻塞式IO方法已经返回
3、线程成功获得了等待的同步监视器
4、线程正在等待某个通知时,其他线程发出了一个通知
5、出于挂起状态的线程被调用了resume恢复方法
5、线程从阻塞状态只能进入就绪状态,无法进入运动状态
6、调用yield方法可以是当前出于运行状态的线程转入就绪状态,
7、线程死亡
1、run方法执行完成,线程正常结束
2、线程抛出一个未捕获的Exception或Error
3、直接调用该线程的stop方法,但stop方法容易导致死锁,所以不推荐使用
6、stop与suspend
1、suspend和stop方法都容易导致死锁,所以不推荐使用
2、suspend方法让线程进入阻塞状态,而stop方法是让线程直接进入死亡状态
7、join:
当在main函数中调用其他线程对象的join方法,主线程被阻塞,则必须等该线程执行结束之后,主线程才能继续执行
8、JVM的垃圾回收线程是一种后台线程,如果前台线程都死亡,则后台线程会自动死亡
9、Sleep与wait
1、wait是Object类提供的方法,而sleep是Tread类中的方法
2、Wait 方法会释放同步锁,而sleep不会
3、都是让当前线程暂时退出运行状态
10、线程让步:yield
线程调用yield方法,让当前线程转入就绪状态,只有优先级与当前先线程相同,或者更高的线程才会获得执行的机会。
11、yield与sleep
1、当前线程都不会释放同步监视器
2、sleep是让线程进入阻塞状态,而yield是让线程进入就绪状态
3、线程调用yield方法,让当前线程转入就绪状态,只有优先级与当前先线程相同,或者更高的线程才会获得执行的机会。而sleep后不会理会其他线程的优先级
4、Sleep方法会抛出InterruptedException异常,而yield不会
5、Sleep方法比yield方法有更好的可移植性,所以不建议使用yield来控制并发线程的执行
12、线程同步的实现方法
1、Synchronized关键字修饰:同步代码块,同步方法
2、使用同步锁Lock来锁定对象
13、当前线程释放同步监视器
1、当线程在同步代码块、同步方法中遇到break\return终止了该代码块、该方法的继续执行,当前线程将会释放同步监视器
2、当线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致该代码块、该方法异常结束时将会释放同步监视器
3、当线程执行同步代码块或同步方法时,程序执行了同步监视器对象的wait()方法,则当前线程暂停,并释放同步监视器
14、synchronized与Lock
1、都可以实现线程同步
2、使用Lock时,显式的使用Lock对象作为同步锁,而Synchronized同步方式中隐式的使用当前对象作为同步锁
3、Lock对象进行同步时,必须显示的释放锁,一般在finally块中显示释放锁,而Synchronized修饰的不用
15、死锁:
当两个线程互相等待对方释放同步锁时,就会发生死锁
16、线程之间的通信
1、wait、notify、notifyAll三方法和条件控制变量配合使用
2、使用lock的condition条件变量(await,signal,signalAll)
3、使用管道流
17、用程序模拟线程间的通信
18、用程序模拟死锁
自己对线程基础知识的整理
猜你喜欢
转载自sha1064616837.iteye.com/blog/2036979
今日推荐
周排行