Java面试问题——线程全面详解总结
2020-12-13 03:48
标签:thread 可变 rac 详解 方法 简化 stat catch 功能 介绍多线程之前要介绍线程,介绍线程则离不开进程。 首先进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元; 线程:就是进程中的一个独立控制单元,线程在控制着进程的执行。一个进程中至少有一个进程。 多线程:一个进程中不只有一个线程。 为什么要用多线程: 新建 :从新建一个线程对象到程序start() 这个线程之间的状态,都是新建状态; 就绪 :线程对象调用start()方法后,就处于就绪状态,等到JVM里的线程调度器的调度; 运行 :就绪状态下的线程在获取CPU资源后就可以执行run(),此时的线程便处于运行状态,运行状态的线程可变为就绪、阻塞及死亡三种状态。 等待/阻塞/睡眠 :在一个线程执行了sleep(睡眠)、suspend(挂起)等方法后会失去所占有的资源,从而进入阻塞状态,在睡眠结束后可重新进入就绪状态。 终止 :run()方法完成后或发生其他终止条件时就会切换到终止状态。 步骤: 、定义类继承Thread; 目的:将自定义代码存储在run方法,让线程运行 该方法有两步:启动线程,调用run方法。 实现步骤: 、定义类实现Runnable接口 实现步骤: 继承Thread:线程代码存放在Thread子类run方法中。 实现Runnable:线程代码存放在接口的子类的run方法中。 实现Callable: 线程睡眠的原因:线程执行的太快,或需要强制执行到下一个线程。 线程睡眠的方法(两个):sleep(long millis)在指定的毫秒数内让正在执行的线程休眠。 sleep(long millis,int nanos)在指定的毫秒数加指定的纳秒数内让正在执行的线程休眠。 线程睡眠的代码演示: 每隔一秒则会打印一次,打印结果为: 扩展: 同步的前提: 如何找问题? Java面试问题——线程全面详解总结 标签:thread 可变 rac 详解 方法 简化 stat catch 功能 原文地址:https://blog.51cto.com/14409778/2413335一、多线程是什么?为什么要用多线程?
二、线程的生命周期:
三、创建线程的方法(还有其他方法):
1、继承Thread类:
2、实现Runnable接口:接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为run 的无参方法。
将线程要运行的代码放在该run方法中。
自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程执行指定对象的run方法就要先明确run方法所属对象3、通过Callable和Future创建线程:
四、继承Thread类和实现Runnable接口、实现Callable接口的区别。
五、线程状态管理
1、线程睡眠---sleep:
public class SynTest {
public static void main(String[] args) {
new Thread(new CountDown(),"倒计时").start();
}
}
class CountDown implements Runnable{
int time = 10;
public void run() {
while (true) {
if(time>=0){
System.out.println(Thread.currentThread().getName() + ":" + time--);
try {
Thread.sleep(1000);
//睡眠时间为1秒
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
倒计时:10
倒计时:9
倒计时:8
倒计时:7
倒计时:6
倒计时:5
倒计时:4
倒计时:3
倒计时:2
倒计时:1
倒计时:0
Java线程调度是Java多线程的核心,只有良好的调度,才能充分发挥系统的性能,提高程序的执行效率。但是不管程序员怎么编写调度,只能最大限度的影响线程执行的次序,而不能做到精准控制。因为使用sleep方法之后,线程是进入阻塞状态的,只有当睡眠的时间结束,才会重新进入到就绪状态,而就绪状态进入到运行状态,是由系统控制的,我们不可能精准的去干涉它,所以如果调用Thread.sleep(1000)使得线程睡眠1秒,可能结果会大于1秒。总结
写在最后