线程基础知识入门

xl_echo编辑整理,欢迎转载,转载请声明文章来源。更多IT、编程案例、资料请联系QQ:1280023003
百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!!


前言:什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

  • 了解单线程的main方法,使用while死循环了解单线程的缺点及优点

示例:

package com.waylau.spring.boot.thymeleaf.thread;

import java.util.concurrent.TimeUnit;

public class TryConcurrency{

  public static void main(String[] args){

    browseNews();
    enjoyMusic();

  }

  private static void browseNews(){
    while (true){
      System.out.println("在树下看报纸");
      sleep(1);
    }
  }

  private static void enjoyMusic(){
    while (true){
      System.out.println("在书房听音乐");
      sleep(1);
    }
  }

  private static void sleep(int seconds){
    try{
      TimeUnit.SECONDS.sleep(seconds);
    }catch (InterruptedException e){
      e.printStackTrace();
    }
  }

}

如果不了解线程的朋友可以试着运行这段代码,在这段代码中我使用了while(true){}这样的死循环,其主要目的就是为了保证当前线程一致在我的while循环中,只要循环崩溃线程就会一致被我的while死循环暂用。(main方法是单线程)。所以我们不难看出,当程序只有一个线程的时候,我们使用while死循环那么就无法继续往下执行,因为main方法的唯一线程被当前while循环占用了。

以上程序输出结果如下:
这里写图片描述

那么,怎么样才能保证我们的两个while循环都能够同时输出呢?那么我们这里就要使用多线程了。既然刚刚说到了while死循环占用了一个线程,线程无法往下执行,第二个死循环需要执行就需要得到第二条线程,那么我们可以重新开一条线程

示例2

package com.waylau.spring.boot.thymeleaf.thread;

import java.util.concurrent.TimeUnit;

public class TryConcurrency{

  public static void main(String[] args){
    new Thread(){//重新建立一条线程
      @Override
      public void run(){
        enjoyMusic();
      }
    }.start();
    browseNews();
  }

  private static void browseNews(){
    while (true){
      System.out.println("在树下看报纸");
      sleep(1);
    }
  }

  private static void enjoyMusic(){
    while (true){
      System.out.println("在书房听音乐");
      sleep(1);
    }
  }

  private static void sleep(int seconds){
    try{
      TimeUnit.SECONDS.sleep(seconds);
    }catch (InterruptedException e){
      e.printStackTrace();
    }
  }

}

当我们再一次执行以上代买之后会发现,我们的第二个while死循环开始执行了, 并且和第一个while死循环一统执行。执行结果如下:
这里写图片描述

我们上面已经看到了在main方法里面同时执行两个while死循环,必定有一个不能执行,原因就是因为只有一条线程,死循环占用线程之后是不会释放的,导致后面一个死循环无法执行。那么我们使用new Thread 线程之后两个线程就满足了我们想同时执行两个while死循环的需求。

从以上我们就可以直观的看到单线程和双线程的一个效果。那么我们程序是不是就不需要单线程了呢?多线程可以执行多个任务,单线程的使用貌似尽显劣势。

  • 单线程优势:线程比较安全,容易管理和维护,消耗资源比较小。实际应用中,我们应用的比较多如Redis等就是使用的单项成,能够很好的保证数据的安全。
  • 多线程不同:它的优势在于能够加快程序的执行,但是资源消耗会高,维护也会相对困难。但是他最大的好处是能够接受很多个任务同时执行,就比如我们刚刚的需求,希望两个while死循环都执行。最为直观的就是我们电脑,多个软件,每一个软件可能是一个线程或者两个以上的线程在执行,如果需要同时启动多个软件,就需要很多线程来维护软件的运行。

线程对于我们来说他的生命周期是怎么样子的呢?这一点我们下一章详细讲解。。。

猜你喜欢

转载自blog.csdn.net/xlecho/article/details/81462582