概念
进程process
进程是操作系统进行资源分配的基本单位。
线程thread
线程是CPU调度执行的基本单位,
进程是线程的容器,
每个线程都有自己的线程栈和寄存器环境。
主线程与子线程
jvm启动时会创建一个主线程,负责执行main方法;
如果在线程a中创建了线程b,称线程b为线程a的子线程。
线程的创建
有继承Thread类、实现Runnable接口、实现Callable接口、线程池、lambda表达式等。
ThreadCreate
package com.duohoob.jvm.thread;
public class ThreadCreate {
static class MyThread extends Thread {
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hello MyThread");
}
}
}
static class MyRunnable implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hello MyRunnable");
}
}
}
/**
* 主线程
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
new MyThread().start();
new Thread(new MyRunnable()).start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("hello lambda");
}
}).start();
for (int i = 0; i < 10; i++) {
Thread.sleep(10);
System.out.println("hello main");
}
}
}
线程的状态
1、new初始状态
通过new创建线程类的实例,线程就进入了初始状态。
2、runnable可运行状态
可运行状态只是说明线程处于可运行状态,但不一定正在运行,真正的运行是CPU调度到该线程。
2.1、ready就绪状态
等待被CPU调度的状态,
调用线程的start()方法,此线程进入就绪状态;
当前线程sleep()结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,线程也将进入就绪状态;
当前线程时间片用完了(因为CPU是根据时间片轮转法调度线程执行),调用当前线程的yield()方法,当前线程进入就绪状态。
2.2、running运行状态
线程调度程序选择当前线程执行。
3、blocked阻塞状态
阻塞状态是线程阻塞在进入synchronized关键字修饰的方法或代码块(获取锁)时的状态。
详见:对于Java中synchronized关键字的简单理解
4、waiting等待
进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断),需要被显式地唤醒。
5、timed_waiting超时等待
可以在指定时间后返回就绪状态。
6、terminated终止状态
主线程的main()方法执行完毕、线程的run()方法执行完毕、或者因异常退出run()方法,线程生命周期结束。
线程的常见方法
sleep
线程休眠
join
线程加入
在线程t1中调用线程t2.join(),表示让t2先执行完毕后t1再继续执行。
yield
线程让步
使线程从running状态进入ready状态,暂时让出CPU资源。