服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 你真的了解Java的多线程方法吗

你真的了解Java的多线程方法吗

2022-10-27 12:08WYSCODER Java教程

这篇文章主要为大家详细介绍了Java的多线程方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

Java 多线程方法详解

start

start方法启动线程在start方法中调用start0方法,而start0是一个本地方法,其底层是C++实现的。

    public synchronized void start() {
      if (threadStatus != 0)
          throw new IllegalThreadStateException();
      group.add(this);
      boolean started = false;
      try {
          start0();
          started = true;
      } finally {
          try {
              if (!started) {
                  group.threadStartFailed(this);
              }
          } catch (Throwable ignore) {
          }
      }
  }
  private native void start0();

run

run方法子线程的执行体,在其方法体中编写线程逻辑,run方法和普通成员方法一样,可以重复调用,当我们单独调用run方法时会在当前线程中执行run方法,并不会启动新线程。

你真的了解Java的多线程方法吗

yield

yield方法线程让步暂停当前线程的执行,并让步于其他同优先级的线程,让其他线程先执行

yield方法是Thread类中的静态方法

public static native void yield();

特点

  • yield方法的让步,能让正在执行的线程由“运行状态”进入到“就绪状态”,等待调度执行。
  • yield仅仅是让出CPU资源,让给谁,是有系统决定的,系统会让其他相同优先级或者是更高优先级的线程来获取执行权,要是没有更高优先级的线程,会继续执行原来的线程。

join

join方法线程合并暂停当前线程的执行,等待子线程执行完毕再继续执行当前线程,也叫做线程插队,join方法做的事情就是讲并行或并发执行的线程合并为串行执行。

代码示例:

public class ThreadMethod02 {
  public static void main(String[] args) throws InterruptedException {
      T2 t2 = new T2();
      t2.start();
      //主线程打印
      int count = 0;
      for (int i = 1; i <= 10; i++) {
          Thread.sleep(1000);
          System.out.println("main" + i);
          if (++count == 5) {
              t2.join();//子线程插队
          }
      }
  }
}
class T2 extends Thread {
  @Override
  public void run() {
      for (int i = 1; i <= 10; i++) {
          try {
              Thread.sleep(1000);//休眠一秒钟
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          System.out.println("A" + i);
      }
  }
}

运行结果:

你真的了解Java的多线程方法吗

sleep

sleep线程休眠,在sleep期间,线程运行状态从运行进入到阻塞状态,会让出CPU的执行权,当线程被重新唤醒时,会由阻塞状态进入到就绪状态,等待CPU的使用权

方法介绍:

  • sleep方法主要有两个,sleep(long millis)和sleep(long millis, int nanos)两个方法功能类似,后一个方法提供更高精度的纳秒级控制。
  • sleep方法是Thread里提供的静态方法,当前的方法也是可以抛出InterruptedException异常,可以被Interrupt中断掉。

你真的了解Java的多线程方法吗

Interrupt

代码示例:

Interrupt中断线程interrupt方法调用仅仅修改了一个中断标志。 如果当前线程是可中断的状态(调用了sleep、join、wait等方法导致线程进入阻塞状态)在其他线程中调用interrupt方法,会立即抛出一个InterruptedException异常,来停止掉中断。如果当前处于运行状态,调用interrupt方法,线程会继续执行,直到发生sleep、join、wait等方法的调用,才会进入阻塞。

Interrupt方法在Thread类中,是一个普通方法,可以通过对象来调用。

public class ThreadMethod03 {
  public static void main(String[] args) throws InterruptedException {
      T3 t3 = new T3();
      t3.start();
      for (int i = 0; i < 3; i++) {
          Thread.sleep(1000);
          System.out.println(Thread.currentThread().getName());
      }
      t3.interrupt();//发送中断
  }
}
class T3 extends Thread {
  @Override
  public void run() {
      for (int i = 0; i < 3; i++) {
          System.out.println("A");
      }
      try {
          System.out.println("进行休眠");
          Thread.sleep(20000);
      } catch (InterruptedException e) {
          System.out.println(Thread.currentThread().getName() + "被Interrupted!!!");
      }
  }
}

运行结果:

你真的了解Java的多线程方法吗

deamon

deamon方法守护线程Java线程有两种,一种是守护线程,一种是用户线程,用户线程一般用户执行用户级任务,一般创建的线程都是用户线程,守护线程也叫做“后台线程”服务于用户线程,一般就是用来执行后台任务,例如:垃圾回收就是由专门线程来处理的,负责垃圾回收的线程就是守护线程。

守护线程存在两个方法

  • public final void setDaemon(boolean on)

设置守护线程,参数是true和false,true表明设置为守护线程, false,设置为非守护线程 ,默认是false。

  • public final boolean isDaemon()

判断是否守护线程,返回Boolean类型

代码示例:

public class ThreadMethod04 {
  public static void main(String[] args) throws InterruptedException {
      T4 t4 = new T4();
      t4.setDaemon(true);//将子线程设置为守护线程
      t4.start();
      if (t4.isDaemon()) {//判断是否是守护线程
          System.out.println("子线程是守护线程");
      }else {
          System.out.println("子线程不是守护线程");
      }
      for (int i = 1;i <= 5;i++) {
          Thread.sleep(1000);
          System.out.println(Thread.currentThread().getName() + i);
      }
  }
}
class T4 extends Thread {
  @Override
  public void run() {
      while (true) {//无限循环
          try {
              Thread.sleep(1000);// 休眠1s钟
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          System.out.println(Thread.currentThread().getName());
      }
  }
}

运行结果:

主线程结束,子线程同时结束

你真的了解Java的多线程方法吗

Priority

Priority线程优先级,就是用来指导线程执行的优先权

方法介绍

  • public final void setPriority(int newPriority):设置线程的优先级
  • public final int getPriority():获取线程的优先级

优先级范围

设置Java线程的优先级,最小值为1,默认值是5,最大值是10

public final static int MIN_PRIORITY = 1;
public final static int NORM_PRIORITY = 5;
public final static int MAX_PRIORITY = 10;

方法特点

1.线程的优先级并不绝对,所控制的是执行的机会,优先级高的线程执行的概率是比较大,而优先级低的线程也并不是没有机会,只是执行的概率会低一些。

2.优先级共10个优先级,分别为1-10,数值越大,表明优先级越高,普通的线程优先级是5。

3.线程的优先级是用来指导JVM层面优先哪个线程执行,最终执行顺序还是需要操作系统来指定。

4.注意:代码最好不要依赖于优先级线程,有可能会造成问题,Java中给定的优先级并不一定严格按照给定优先级执行。

代码示例:

public class ThreadMethod05 {
  public static void main(String[] args) {
      T5 t5 = new T5();
      t5.setPriority(10);//设置优先级为10
      int priority = t5.getPriority();//获取优先级
      System.out.println(priority);
  }
}

class T5 extends Thread {
  @Override
  public void run() {
      System.out.println("A");
  }
}

运行结果:

你真的了解Java的多线程方法吗

 

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/sheng0113/article/details/123797045

延伸 · 阅读

精彩推荐
  • Java教程java设计模式之单例模式学习

    java设计模式之单例模式学习

    单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在 ...

    java教程网2212019-10-30
  • Java教程springboot:接收date类型的参数方式

    springboot:接收date类型的参数方式

    这篇文章主要介绍了springboot:接收date类型的参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    huiy_小溪9172022-02-20
  • Java教程基于sharding-jdbc的使用限制

    基于sharding-jdbc的使用限制

    这篇文章主要介绍了sharding-jdbc的使用限制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    重度孤独症患者8992022-03-06
  • Java教程Spring Boot配置Thymeleaf(gradle)的简单使用

    Spring Boot配置Thymeleaf(gradle)的简单使用

    今天小编就为大家分享一篇关于Spring Boot配置Thymeleaf(gradle)的简单使用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一...

    执笔记忆的空白9922021-06-20
  • Java教程Shiro集成Spring之注解示例详解

    Shiro集成Spring之注解示例详解

    Shiro想必大家都知道了,是目前使用率要比spring security都要多的一个权限框架,下面这篇文章主要给大家介绍了关于Shiro集成Spring之注解的相关资料,文中通...

    赵俊9072021-05-30
  • Java教程SpringBoot之LogBack配置详解

    SpringBoot之LogBack配置详解

    这篇文章主要介绍了SpringBoot之LogBack配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    WeYunx11012021-07-17
  • Java教程Spring框架的JdbcTemplate使用

    Spring框架的JdbcTemplate使用

    它是 Spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。本文就来介绍一下Spring框架的JdbcTemplate使用,感兴趣的可以了解一下...

    Hudie.11772021-12-30
  • Java教程详解log4j.properties的简单配置和使用

    详解log4j.properties的简单配置和使用

    本篇文章主要介绍了详解log4j.properties的简单配置和使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    BigNew23202021-03-01