1. 什么是线程?
- 一条线程指的是进程中一个单一顺序的控制流。
- 一个进程包括由操作系统分配的内存空间。
- 一个进程中可以并发多个线程。
- 一个线程不能独立的存在,它必须是进程的一部分。
- 多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
2. 一个线程的生命周期图
1. 使用 new 关键字和 Thread 类或其子类建立一个线程对象。
2. 该线程对象就处于新建状态,它保持这个状态直到程序 start() 这个线程。
3. 新建:创建线程对象。
1. 当线程对象调用了start()方法之后,该线程就进入就绪状态。
2. 就绪状态的线程处于就绪队列中,要等待 JVM里线程调度器的调度。
3. 就绪:线程有执行资格,没有执行权。
1. 如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。
2. 处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
3. 有执行资格,有执行权。
1. 如果一个线程执行了 sleep() (睡眠)、suspend()(挂起)等方法,线程就从运行状态进入阻塞状态。
2.分为三种情况:
- 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
- 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
- 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。
3. 由于一些操作让线程改变了状态,没有执行资格,没有执行权
另一些操作可以把它给激活,激活处于就绪状态
1. 一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
2. 死亡:线程对象变成垃圾,等待被回收。
3. 线程的优先级
- Java 线程的优先级是一个整数。
- 取值:1 ~ 10
- 线程Thread有一个设置优先级的属性Priority,默认数值为5
- 设置的越高优先级越高
- 优先级作用只是表示了执行的概率,也就是说优先级6的线程比5的线程概率更高
- 在Java中,高优先级的可运行线程会抢占低优先级线程。
- 如何设置优先级?
例如:
MyThread myThread = new MyThread();
myThread.setPriority(10);
4. 通过实现 Runnable 接口来创建线程
package javaadvanced.thread;
class RunnableDemo implements Runnable {
private Thread thread;
private String threadName;
RunnableDemo(String name) {
this.threadName = name;
System.out.println("Creating " + threadName);
}
@Override
public void run() {
System.out.println("Running " + threadName);
try {
for (int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
Thread.sleep(50);
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start() {
System.out.println("Starting " + threadName);
if (thread == null) {
thread = new Thread(this, threadName);
thread.start();
}
}
}
public class MyThread {
public static void main(String[] args) {
RunnableDemo thread1 = new RunnableDemo("Thread1");
thread1.start();
RunnableDemo thread2 = new RunnableDemo("Thread2");
thread2.start();
}
}
Creating Thread1
Starting Thread1
Creating Thread2
Starting Thread2
Running Thread1
Thread: Thread1, 4
Running Thread2
Thread: Thread2, 4
Thread: Thread1, 3
Thread: Thread2, 3
Thread: Thread1, 2
Thread: Thread2, 2
Thread: Thread1, 1
Thread: Thread2, 1
Thread Thread1 exiting.
Thread Thread2 exiting.
5. 通过继承Thread来创建线程
class ThreadDemo extends Thread {
private Thread thread;
private String threadName;
ThreadDemo(String name) {
this.threadName = name;
System.out.println("Creating " + threadName);
}
@Override
public void run() {