Java线程学习第一篇

78 阅读2分钟

「这是我参与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调度的阶段的状态称为可执行状态。

待续~