Thread基础

  工作快两年了,因为日常工作中很少用到多线程,关于多线程的一些基本知识都已经快忘记了,所以打算重新梳理一遍多线程的知识,加深一下理解。

  Java中线程有以下几种状态,

1. 初始状态:新创建一个线程对象。

2. 运行状态:Java将就绪和运行中统称为运行状态,其中就绪表示一个线程正在线程池中,等待cpu的调用。运行中表示一个线程在获得cpu的时间片之后的状态。

3. 阻塞状态:一个线程因为某种原因,放弃对cpu的使用权,暂时停止运行。阻塞状态又分为

  3.1 等待阻塞:运行中的线程执行wait()方法后,该线程会进入等待池中。

  3.2 超时等待阻塞:运行中的线程执行带有参数的wait(long timeout)方法,当等待timeout毫秒后,线程会重新进入就绪状态。

  3.2 同步阻塞:运行时的线程获取对象的同步锁时,如果这个同步锁正在被别的线程占用,那么该线程会进入锁池。

  3.4 其他阻塞:运行中的线程调用sleep()方法,join()方法或者执行io请求时,该线程进入阻塞状态。

4. 死亡状态:线程执行完毕,生命周期结束

  多线程中的常用方法理解

1. yield()方法

  让运行中的线程回到就绪状态,来让与这个线程拥有相同优先级的其他线程获得运行机会,但是因为是回到就绪状态,所以无法保证达到让步的目的,因为还是可能会被线程调度再次选中。

2. sleep()方法

  让运行中的线程休眠指定时间,暂时停止执行,之后变为就绪状态,通过这个方法可以让其他线程获取运行机会。

3. start()方法

  使用该方法让一个线程从初始状态进入就绪状态。

4. interrupt()方法

  虽然字面翻译时打断,中断的意思,但是这个方法只是标记线程的中断标记,默认为false,该方法会将中断标记标志为true,并不会让线程停止运行。注意,当这个线程处于阻塞状态时,这个方法会抛出InteruptedException。

5. interrupted()方法

  查看线程的中断标记,并且重新将中断标记标志为false。

6. isInterrupted()方法

  查看线程的中断标记,并不会将中断标记重新标志为false。

7. join()方法

  将线程B加入到线程A中,线程B执行完毕后线程A才能继续执行。

8. wait()方法

  将线程变为阻塞状态。注意,该方法必须在同步代码块中使用,他会先释放锁,然后让出cpu,进入阻塞状态

9. notify()方法和notifyAll()方法

  将处于阻塞的线程唤醒,重新进入就绪状态,注意,该方法必须在同步代码块中使用,而且wait和notify的顺序不能错,就是必须要先wait然后才notify,否则不会唤醒。而且notify方法并不会立即释放锁,他会执行完同步代码块中的方法然后才释放锁。

  

posted @ 2018-11-12 22:21  徐世龙  阅读(138)  评论(0)    收藏  举报