自己对线程基础知识的整理

我自己对线程一章的总结:
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
今日推荐