线程知识点梳理
什么是线程
线程是操作系统能够进行运算调度的最小单位。
被包含在进程之中,是进程中的实际运作单位。
一条线程指的是进程中一个控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
引入线程的优点
进程间可以并发,进程内的线程间也可以并发。
系统开销变小:切换线程不用切换进程。
Thread的基本操作
1.启动线程:调用start()方法,一个线程只允许调用一次start()方法。
2.如何停止一个线程:A线程调用interrupt()方法通知B线程停止,B线程收到通知后,自行决定要何时且以何种方式停止。
3.属性相关:get/set
4.启动/停止/等待停止
5.静态方法:
Thread.currentThread() : 获取调用该方法线程对象的引用。
Thread.sleep():让线程休眠一段时间,然后再执行。或者让线程放弃CPU,等待一段时间后,重新就绪,重新排队等待分配CPU。(sleep很难精确,能做到超过要求的时间)
sleep方法放弃CPU同时放弃了抢占CPU的资格。直到某个条件满足。Thread.yield()方法放弃CPU但没有放弃抢占CPU的资格。
线程的属性
线程本质是一个调度单位。
一个JVM应用中,允许有多个线程同时运行,其中,运行main方法的最开始的线程,是一个非后台线程,一般称为主线程。
任何线程都是由另一个线程还行代码创建出来的,习惯称其位父子线程。
线程调度什么时候排到CPU是随机的,什么时候从CPU上切换下来也是随机的,无法以我们看到的方法甚至是语句为间隔。
多CPU计算机中,各个线程可占用不同的CPU
每个线程用有一个线程ID,线程控制决(TCB)
同一进程的线程切换,不会引起进程切换
不同进程的线程切换,会引起进程的切换
线程的状态
1.创建
2.就绪
3.运行
4.阻塞
5.终结
JDK中通过枚举来描述:Thread.State
查看线程状态:Thread.getState()。
线程必须占有CPU才能运行代码。
无论什么原因,一个线程现在没有CPU的话就需要先进入就绪状态,排队等待分配CPU,然后才能进入运行状态。
怎么创建一个线程
1.定义类,集成Thread类。
2.覆写该类的run方法。
3.构造该类的对象。
4.调用对象的start()方法,把线程加入就绪队列,等待调度。
public class HowToInstanceThread {
static class A extends Thread {
@Override
public void run() {
System.out.println("我是A类");
}
}
static class B implements Runnable {
@Override
public void run() {
System.out.println("我是B类");
}
}
public static void main(String[] args) {
Thread thread;
{
// 1. 直接 new A 类的对象,本身就是一个 Thread 对象
A a = new A();
thread = a;
thread.start();
}
{
// 2. new B 类的对象,是一个 Runnable,作为任务传递给线程对象
B b = new B();
// thread = b; 这个不能指向
thread = new Thread(b);
thread.start();
}
{
// 3. new A 类的对象,但把该对象,当作 Runnable 使用
// 因为 Thread 本来就实现了 Runnable
A a = new A();
thread = new Thread(a);
thread.start();
}
}
}