1.线程定义
Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
2.进程的定义
一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的
3.一个线程的生命周期
4.线程的状态
六大状态 | |
NEW | 新建/就绪 |
RUNNABLE | 运行状态 |
BLOCKED | 阻塞状态 |
WAITING | 死死等待 |
TIMED-WAITING | 超时等待 |
TERMINATED | 死亡状态 |
-
新建状态:
使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
-
就绪状态:
当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
-
运行状态:
如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
-
阻塞状态:
如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
- 等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
- 同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
- 其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
-
死亡状态:
一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态
5.线程的优先级
public static final int MIN_PRIORITY = 1 最小优先级
public static final int NORM_PRIORITY = 5 默认优先级
public static final int MAX_PRIORITY = 10 最大优先级
6.创建一个线程
- 通过实现 Runnable 接口;
- 通过继承 Thread 类本身;
//实现Runnable接口
public class MyRunnable implements Runnable {
@Override
public void run () {
for (int i = 0; i < 50; i++) {
System.out.println("当前执行的线程为:" + Thread.currentThread().getName() + " " + "i=" + i);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
//3)创建MyRunnable类对象
MyRunnable my = new MyRunnable() ;
//创建线程Thread类对象
Thread t1 = new Thread(my,"线程1") ;
Thread t2 = new Thread(my,"线程2") ;
//启动线程
t1.start() ;
t2.start() ;
}
}
//线程类
public class MyThread extends Thread { //public final String getName()
//重写Thread类的run方法
//my1,my2线程都要执行run方法...
@Override
public void run() {
//jvm调用的
//存储耗时代码
for(int x = 0 ; x <200 ; x ++){
System.out.println(getName()+":"+x);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
//创建线程类对象
MyThread my1 = new MyThread() ;
MyThread my2 = new MyThread() ;
//设置线程名称
my1.setName("詹姆斯") ;
my2.setName("库里") ;
my1.start();
my2.start();
}
}
7.Thread 方法
序号 | 方法描述 |
1 | public void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。 |
2 | public void run() 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。 |
3 | public final void setName(String name) 改变线程名称,使之与参数 name 相同。 |
4 | public final void setPriority(int priority) 更改线程的优先级 |
5 | public final void setDaemon(boolean on) 将该线程标记为守护线程或用户线程。 |
6 | public final void join(long millisec) 等待该线程终止的时间最长为 millis 毫秒。 |
7 | public void interrupt() 中断线程。 |
8 | public final boolean isAlive() 测试线程是否处于活动状态。 |
8.线程的几个主要概念
-
线程同步
-
线程间通信
-
线程死锁
-
线程控制:挂起、停止和恢复