「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
前言
临近春节假期,组里的项目基本上接近尾声,开发任务不多了,都在测试及解决bug。正好利用这段时间学习一下Java 线程,过完春节我们的项目会有可能重构,其中会有多线程的处理,接下来就边学习边总结吧。
Thread 线程
对计算机来说,每一个任务就是一个进程(Process),在每一个进程内部至少要有一个线程(Thread)是在运行中的。先从创建并启动一个线程开始:
public class TryThread{
public static void main(String[] args){
//通过匿名内部类的方式创建线程,并重写其中的run方法
new Thread(){
@Override
public void run(){
enjoyMusic();
}
}.start();
browseNews();
}
private static void browseNews(){
for(; ; ){
System.out.println("news");
sleep(1);
}
}
private static void enjoyMusic(){
for(; ; ){
System.out.println("music");
sleep(1);
}
}
private static void sleep(int seconds){
try{
TimeUnit.SECONDS.sleep(seconds);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
控制台会输出如下:
news
music
news
music
......
这就模拟了听音乐和看新闻两个事件并发执行的效果。在这个过程中,Java 虚拟机JVM启动时创建了main线程,然后我们还显示的创建了一个线程,此外还会有一些其它的守护线程如垃圾回收线程。
线程生命周期
上面的代码中执行了Thread的start方法,这时该线程就已经开始执行了吗?
准确来说,线程的生命周期大体可以分为如下五个主要的阶段:
- NEW
- RUNNABLE
- RUNNING
- BLOCKED
- TERMINATED
先来说线程的NEW状态:
当我们用关键字new 创建一个Thread对象时,此时它并不处于执行状态,因为这个时候还没有调用start方法启动这个线程,它只是Thread对象的状态,在start之前这和用关键字new创建一个普通的Java对象没有区别。
NEW状态通过start方法进入RUNNABLE状态:
调用了start方法,此时才是真正地在JVM进程中创建了一个线程。线程一经创建就可以立即得到执行吗?当然不是,线程的运行还受CPU的调度。我们把具备执行资格并没有真正被执行处于等待CPU调度的阶段的状态称为可执行状态。