前言
本文正在参加「Java主题月 – Java Debug笔记活动」,详情查看 活动链接
进程和线程的区别
进程(Process)描述是一个程序运行态的实体,如我们经常使用的QQ.exe,浏览器chrome.exe,在操作系统中都是以进程的方式存在
线程(英语:thread)是操作系统
能够进行运算调度的最小单位 ,进程是线程的容器,线程包含于进程,一个进程中可以有多个进程,如我们使用的QQ,运行态只有一个QQ.EXE进程,对应里面有多个线程,分别负责接收消息,发送消息,渲染UI等等
多线程和CPU核数的关系
这里问题也是我的一个知识盲点,查了很多也没有理解的很透彻,这里说下我自己的理解,本质上java的线程技术是基于操作系统级线程来进行实现的,在CPU单核时代(这里的核数指的CPU物理核数),多线程的进行是通过抢占CPU时间片来实现多线程
的,你可以理解为1-100毫秒中,1-10毫秒在播放音乐10-50在渲染QQUI界面,在这个期间(10-50)音乐播放是暂停的,但是因为时间片切换的时间很短,所以从我们的感官上认为音乐和UI渲染是同时并行进行的,本质上还是单线程,本质上是为了加大对CPU的利用率,到了多核时代,多线程在CPU的调度中会被调度到多个核中同时进行,也就是真正意义上的多线程并行
线程的生命周期
java中的线程状态主要分为,NEW
,RUNNABLE
,BLOCKED
,WAITING
,TIMED_WAITING
,TERMINATED
六个状态
-
BLOCKED
一个线程的线程状态阻塞等待监视器锁定。 -
NEW
线程尚未启动的线程状态。 -
RUNNABLE
可运行线程的线程状态。 -
TERMINATED
终止线程的线程状态。 -
TIMED_WAITING
具有指定等待时间的等待线程的线程状态。 -
WAITING
等待线程的线程状态,public static final Thread.State WAITING
-
Enum Constant Detail
-
NEW
public static final Thread.State NEW 复制代码
线程尚未启动的线程状态。可以理解为NEW THREAD() 后即新建状态,奇怪的是并没有的Thread类出构造方法中找到关于status变量的赋值修改
-
RUNNABLE
public static final Thread.State RUNNABLE 复制代码
可运行线程的线程状态。 可运行状态的线程正在Java虚拟机中执行,但它可能正在等待来自操作系统(例如处理器)的其他资源。
-
WAITING
public static final Thread.State WAITING 复制代码
等待线程的线程状态
Object.wait
没有超时Thread.join
没有超时LockSupport.park
等待状态的线程正在等待另一个线程执行特定的动作。 例如,已经在对象上调用
Object.wait()
线程正在等待另一个线程调用该对象上Object.notify()
Object.notifyAll()
或。 调用Thread.join()的
线程正在等待指定的线程终止。 -
TERMINATED
public static final Thread.State TERMINATED 复制代码
终止线程的线程状态。 线程已完成执行。
-
实现线程的几种方式
继承Thread类,重写RUN方法
- 继承Thread类,重写其
run
方法,方法体为线程执行内容 - 实例化Thread实现类,调用其start方法启动线程
public class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("run方法执行了");
}
public static void main(String[] args) {
new ThreadDemo().start();
}
}
复制代码
实现Runnable接口
- 实现Runnable接口,实现
run
方法,方法体为线程执行内容 - 实例化Runnable接口实现类,并将该实力作为参数实例化Thread对象
- 调用其start方法启动线程
public class ThreadDemo2 implements Runnable{
@Override
public void run() {
System.out.println("runnable run方法执行了");
}
public static void main(String[] args) {
new Thread(new ThreadDemo2()).start();
}
}
复制代码
结合Future,实现Callable接口
- 实现Callable接口,并定义返回类型
- 实现
call
方法,该方法将返回绗棉接口定义的返回类型的值 - 构造Future实例,将Callable接口实现类作为其构造参数
- 将Future实例作为Thread实例的构造参数,并调用start方法
- 当
call
方法执行完毕后会返回值,这个值可以通过future的get方法获取
public class ThreadDemo3 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("runnable run方法执行了");
return 1;
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadDemo3 threadDemo3 = new ThreadDemo3();
FutureTask<Integer> futureTask = new FutureTask<>(threadDemo3);
new Thread(futureTask).start();
System.out.println(futureTask.get());
}
}
复制代码