mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-16 18:10:13 +08:00
commit
f411dc38b3
@ -20,7 +20,7 @@
|
|||||||
2. **可运行(runnable)**:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。
|
2. **可运行(runnable)**:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。
|
||||||
3. **运行(running)**:可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
|
3. **运行(running)**:可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。
|
||||||
4. **阻塞(block)**:阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种:
|
4. **阻塞(block)**:阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种:
|
||||||
- **(一). 等待阻塞**:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waitting queue)中。
|
- **(一). 等待阻塞**:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waiting queue)中。
|
||||||
- **(二). 同步阻塞**:运行(running)的线程在获取对象的同步锁时,若该同步 锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
|
- **(二). 同步阻塞**:运行(running)的线程在获取对象的同步锁时,若该同步 锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
|
||||||
- **(三). 其他阻塞**: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
|
- **(三). 其他阻塞**: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
|
||||||
5. **死亡(dead)**:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
|
5. **死亡(dead)**:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。
|
||||||
@ -82,10 +82,10 @@ public class Run {
|
|||||||

|

|
||||||
从上面的运行结果可以看出:线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。
|
从上面的运行结果可以看出:线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。
|
||||||
|
|
||||||
###②实现Runnable接口
|
### ②实现Runnable接口
|
||||||
推荐实现Runnable接口方式开发多线程,因为Java单继承但是可以实现多个接口。
|
推荐实现Runnable接口方式开发多线程,因为Java单继承但是可以实现多个接口。
|
||||||
|
|
||||||
<MyRunnable.java
|
MyRunnable.java
|
||||||
|
|
||||||
```java
|
```java
|
||||||
public class MyRunnable implements Runnable {
|
public class MyRunnable implements Runnable {
|
||||||
@ -164,7 +164,7 @@ Thread类中包含的成员变量代表了线程的某些优先级。如**Thread
|
|||||||
|
|
||||||
**如何设置守护线程?**
|
**如何设置守护线程?**
|
||||||
|
|
||||||
可以通过调用 Thead 类的 `setDaemon(true)` 方法设置当前的线程为守护线程>。
|
可以通过调用 Thead 类的 `setDaemon(true)` 方法设置当前的线程为守护线程。
|
||||||
|
|
||||||
注意事项:
|
注意事项:
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ Thread类中包含的成员变量代表了线程的某些优先级。如**Thread
|
|||||||
- 两者最主要的区别在于:**sleep方法没有释放锁,而wait方法释放了锁** 。
|
- 两者最主要的区别在于:**sleep方法没有释放锁,而wait方法释放了锁** 。
|
||||||
- 两者都可以暂停线程的执行。
|
- 两者都可以暂停线程的执行。
|
||||||
- Wait通常被用于线程间交互/通信,sleep通常被用于暂停执行。
|
- Wait通常被用于线程间交互/通信,sleep通常被用于暂停执行。
|
||||||
- wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者nofifyAl()方法。sleep()方法执行完成后,线程会自动苏醒。
|
- wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()方法执行完成后,线程会自动苏醒。
|
||||||
|
|
||||||
|
|
||||||
## 9 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
|
## 9 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user