广告
返回顶部
首页 > 资讯 > 精选 >Java并发编程的基础知识有哪些
  • 558
分享到

Java并发编程的基础知识有哪些

2023-06-16 18:06:23 558人浏览 独家记忆
摘要

今天小编给大家分享一下Java并发编程的基础知识有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 01、简介首

今天小编给大家分享一下Java并发编程的基础知识有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

 01、简介

首先还是的了解一下线程的基础,这边文章将带着大家来了解一下线程的基础知识。

02、线程的创建方式

  1. 实现 Runnable 接口

  2. 继承 Thread 类

  3. 实现 Callable 接口通过 FutureTask 包装器来创建线程

  4. 通过线程池创建线程

下面将用线程池和 Callable 的方式来创建线程

public class CallableDemo implements Callable<String> {      @Override     public String call() throws Exception {         int a=1;         int b=2;         System. out .println(a+b);         return "执行结果:"+(a+b);     }      public static void main(String[] args) throws ExecutionException, InterruptedException {         //创建一个可重用固定线程数为1的线程池         ExecutorService executorService = Executors.newFixedThreadPool (1);         CallableDemo callableDemo=new CallableDemo();         //执行线程,用future来接收线程的返回值         Future<String> future = executorService.submit(callableDemo);         //打印线程的返回值         System. out .println(future.get());         executorService.shutdown();     } }

执行结果

3 执行结果:3

03、线程的生命周期

  1. NEW:初始状态,线程被构建,但是还没有调用 start 方法。

  2. RUNNABLED:运行状态,JAVA 线程把操作系统中的就绪和运行两种状态统一称为“运行中”。调用线程的 start()  方法使线程进入就绪状态。

  3. BLOCKED:阻塞状态,表示线程进入等待状态,也就是线程因为某种原因放弃了 CPU 使用权。比如访问 synchronized  关键字修饰的方法,没有获得对象

  4. Waiting :等待状态,比如调用 wait() 方法。

  5. TIME_WAITING:超时等待状态,超时以后自动返回。比如调用 sleep(long millis) 方法

  6. TERMINATED:终止状态,表示当前线程执行完毕。

看下源码

public enum State {         NEW,         RUNNABLE,         BLOCKED,         WAITING,         TIMED_WAITING,         TERMINATED; }

04、线程的优先级

  1. 线程的最小优先级:1

  2. 线程的最大优先级:10

  3. 线程的默认优先级:5

  4. 通过调用 getPriority() 和 setPriority(int newPriority) 方法来获得和设置线程的优先级

看下源码:

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

看下代码:

public class ThreadA extends Thread {      public static void main(String[] args) {         ThreadA a = new ThreadA();         System.out.println(a.getPriority());//5         a.setPriority(8);         System.out.println(a.getPriority());//8     } }

线程优先级特性:

  1. 继承性:比如 A 线程启动 B 线程,则B线程的优先级与 A 是一样的。

  2. 规则性:高优先级的线程总是大部分先执行完,但不代表高优先级线程全部先执行完。

  3. 随机性:优先级较高的线程不一定每一次都先执行完。

05、线程的停止

  1. stop() 方法,这个方法已经标记为过时了,强制停止线程,相当于 kill -9。

  2. interrupt() 方法,优雅的停止线程。告诉线程可以停止了,至于线程什么时候停止,取决于线程自身。

看下停止线程的代码:

public class InterruptDemo {     private static int i ;     public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(() -> {             //默认情况下isInterrupted 返回 false、通过 thread.interrupt 变成了 true             while (!Thread.currentThread().isInterrupted()) {                 i++;             }             System.out.println("Num:" + i);         }, "interruptDemo");         thread.start();         TimeUnit.SECONDS.sleep(1);         thread.interrupt(); //不加这句,thread线程不会停止     } }

看上面这段代码,主线程 main 方法调用 thread线程的 interrupt() 方法,就是告诉 thread 线程,你可以停止了(其实是将  thread 线程的一个属性设置为了 true ),然后 thread 线程通过 isInterrupted() 方法获取这个属性来判断是否设置为了  true。这里我再举一个例子来说明一下,

看代码:

public class ThreadDemo {     private volatile static Boolean interrupt = false ;     private static int i ;      public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(() -> {             while (!interrupt) {                 i++;             }             System.out.println("Num:" + i);         }, "ThreadDemo");         thread.start();         TimeUnit.SECONDS.sleep(1);         interrupt = true;     } }

是不是很相似,再简单总结一下:

当其他线程通过调用当前线程的 interrupt  方法,表示向当前线程打个招呼,告诉他可以中断线程的执行了,并不会立即中断线程,至于什么时候中断,取决于当前线程自己。

线程通过检查自身是否被中断来进行相应,可以通过 isInterrupted() 来判断是否被中断。

这种通过标识符来实现中断操作的方式能够使线程在终止时有机会去清理资源,而不是武断地将线程停止,因此这种终止线程的做法显得更加安全和优雅。

06、线程的复位

两种复位方式:

  1. Thread.interrupted()

  2. 通过抛出 InterruptedException 的方式

然后了解一下什么是复位:

线程运行状态时 Thread.isInterrupted() 返回的线程状态是 false,然后调用 thread.interrupt() 中断线程  Thread.isInterrupted() 返回的线程状态是 true,最后调用 Thread.interrupted()  复位线程Thread.isInterrupted() 返回的线程状态是 false 或者抛出 InterruptedException  异常之前,线程会将状态设为 false。

下面来看下两种方式复位线程的代码,首先是 Thread.interrupted() 的方式复位代码:

public class InterruptDemo {      public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(() -> {             while (true) {                 //Thread.currentThread().isInterrupted()默认是false,当main方式执行thread.interrupt()时,状态改为true                 if (Thread.currentThread().isInterrupted()) {                     System.out.println("before:" + Thread.currentThread().isInterrupted());//before:true                     Thread.interrupted(); // 对线程进行复位,由 true 变成 false                     System.out.println("after:" + Thread.currentThread().isInterrupted());//after:false                 }             }         }, "interruptDemo");         thread.start();         TimeUnit.SECONDS.sleep(1);         thread.interrupt();     } }

抛出 InterruptedException 复位线程代码:

public class InterruptedExceptionDemo {      public static void main(String[] args) throws InterruptedException {         Thread thread = new Thread(() -> {             while (!Thread.currentThread().isInterrupted()) {                 try {                     TimeUnit.SECONDS.sleep(1);                 } catch (InterruptedException e) {                     e.printStackTrace();                     // break;                 }             }         }, "interruptDemo");         thread.start();         TimeUnit.SECONDS.sleep(1);         thread.interrupt();         System.out.println(thread.isInterrupted());     } }

结果:

false java.lang.InterruptedException: sleep interrupted     at java.lang.Thread.sleep(Native Method)     at java.lang.Thread.sleep(Thread.java:340)     at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)     at com.cl.concurrentprogram.InterruptedExceptionDemo.lambda$main$0(InterruptedExceptionDemo.java:16)     at java.lang.Thread.run(Thread.java:748)

需要注意的是,InterruptedException  异常的抛出并不意味着线程必须终止,而是提醒当前线程有中断的操作发生,至于接下来怎么处理取决于线程本身,比如

  1. 直接捕获异常不做任何处理

  2. 将异常往外抛出

  3. 停止当前线程,并打印异常信息

像我上面的例子,如果抛出 InterruptedException 异常,我就break跳出循环让 thread 线程终止。

为什么要复位:

Thread.interrupted()  是属于当前线程的,是当前线程对外界中断信号的一个响应,表示自己已经得到了中断信号,但不会立刻中断自己,具体什么时候中断由自己决定,让外界知道在自身中断前,他的中断状态仍然是  false,这就是复位的原因。

以上就是“java并发编程的基础知识有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: Java并发编程的基础知识有哪些

本文链接: https://www.lsjlt.com/news/284650.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java并发编程的基础知识有哪些
    今天小编给大家分享一下Java并发编程的基础知识有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 01、简介首...
    99+
    2023-06-16
  • Java编程基础知识点有哪些
    这篇文章主要介绍“Java编程基础知识点有哪些”,在日常操作中,相信很多人在Java编程基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java编程基础知识点有...
    99+
    2022-10-19
  • JAVA编程语言的基础知识有哪些
    这篇文章主要介绍“JAVA编程语言的基础知识有哪些”,在日常操作中,相信很多人在JAVA编程语言的基础知识有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JAVA编程语言的基础知识有哪些”的疑惑有所帮助!...
    99+
    2023-06-17
  • shell编程基础知识有哪些
    这篇文章主要介绍了shell编程基础知识有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、文件类型介绍linux系统中主要包括以下七种文件类型: d 目录 - 普通文件...
    99+
    2023-06-09
  • JavaScript编程基础知识有哪些
    这篇“JavaScript编程基础知识有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2022-10-19
  • Java编码基础知识点有哪些
    这篇文章主要介绍“Java编码基础知识点有哪些”,在日常操作中,相信很多人在Java编码基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java编码基础知识点有...
    99+
    2022-10-19
  • JAVA编程语言的基础知识点有哪些
    本篇内容介绍了“JAVA编程语言的基础知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、面向对象的特征有哪些方面抽象:抽象就是忽...
    99+
    2023-06-17
  • 有哪些Java基础知识
    本篇内容介绍了“有哪些Java基础知识”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 面向对象与面向过程的区别首先面向过程和面向对...
    99+
    2023-06-16
  • java基础知识有哪些
    这篇文章给大家分享的是有关java基础知识有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.java基础1.1Java历史Java:由Sun Microsystems公司于1995年5月推出的Java程序设...
    99+
    2023-06-20
  • Java的基础知识有哪些
    这篇文章主要介绍“Java的基础知识有哪些”,在日常操作中,相信很多人在Java的基础知识有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的基础知识有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • Java基础知识点有哪些
    这篇文章主要介绍“Java基础知识点有哪些”,在日常操作中,相信很多人在Java基础知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java基础知识点有哪些”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-02
  • python的网络编程基础知识有哪些
    这篇“python的网络编程基础知识有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python的网络编程基础知识有哪些...
    99+
    2023-06-26
  • Java多线程基础知识点有哪些
    这篇文章主要为大家展示了“Java多线程基础知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java多线程基础知识点有哪些”这篇文章吧。一、线程什么是线程:线程是进程的一个实体,是CP...
    99+
    2023-06-25
  • Java开发中需要知道的基础知识有哪些
    这篇文章将为大家详细讲解有关Java开发中需要知道的基础知识有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 是一个多功能的编程语言,在某种程度上,它用在几乎所有可能涉及计算机的行业了里。Ja...
    99+
    2023-06-02
  • Java入门基础知识有哪些
    这篇文章主要介绍“Java入门基础知识有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java入门基础知识有哪些”文章能帮助大家解决问题。Java 是由Sun Microsystems公司于19...
    99+
    2023-06-02
  • Java中的基础知识点有哪些
    这篇文章主要讲解了“Java中的基础知识点有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的基础知识点有哪些”吧!"Hello World!"先来看一个He...
    99+
    2023-06-02
  • Python编程中常用的基础知识有哪些
    本篇内容介绍了“Python编程中常用的基础知识有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、正则表达式替换目标:将字符串line...
    99+
    2023-06-02
  • C++程序基础知识有哪些
    本篇内容主要讲解“C++程序基础知识有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++程序基础知识有哪些”吧!class  A   {&...
    99+
    2023-06-17
  • Linux进程的基础知识有哪些
    这篇文章主要讲解了“Linux进程的基础知识有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux进程的基础知识有哪些”吧!计算机实际上可以做的事情实质上非常简单,比如计算两个数的和...
    99+
    2023-06-16
  • 有哪些Python基础知识
    这篇文章主要介绍“有哪些Python基础知识”,在日常操作中,相信很多人在有哪些Python基础知识问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”有哪些Python基础知识”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作