多线程编程之线程基础(代码片段)

author author     2023-02-05     273

关键词:

前言

此内容是阅读了书籍《JAVA多线程编程核心技术》后作为学习总结的文章,同时也梳理一下内容。建议大家有兴趣都可以阅读一下这本书,对于想了解更多的同学来说是一个很好的教材,同时建议大家多去思考和动手编写代码,融会贯通之后再去看一遍,会有更多的体会。就比如《JVM底层实现最佳实战》的书籍一样,我读了已经不下五遍了,但每次读都能有新的收获一样。希望对大家有帮助。

该篇文章是用于了解多线程的一些基本概念、JDK支持多线程编程的类和方法,接口等。

1.1 进程与线程概念

什么是进程:
进程是操作系统结构的基础,是一次程序的执行,是程序及其数据结构在处理机上顺序执行时所发生的活动;
是程序在数据集合上运行的过程,它是系统进行资源分配和调度的独立单位。比如说:操作系统中运行的exe就是一个进程。其实进程就是应用。

什么是线程:
线程可以理解为进程中独立运行的子任务。比如QQ.exe运行时,有好友视频线程,文件下载线程,传输数据线程,发送表情线程等等。

1.2 实现多线程编程

JDK开发包中,自带了对多线程技术的支持,可以方便进行多线程编程。
实现多线程编程有多种方式:继承Thread类,实现Runnable接口,Callable接口

1.2.1继承Thread类

在继承Thread类实现多线程编程之前,我们先来看看Thread类结构:
优先级:[1,10]
线程状态:新建、就绪、阻塞、运行、死亡
public enum State
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;

态切换图:
技术分享图片

1.2.2实现Runnable接口

    @FunctionalInterface
    public interface Runnable 
        public abstract void run();
    

1.2.3实现Callable接口

    @FunctionalInterface
    public interface Callable<V> 
        V call() throws Exception;
    

1.2.4Runnable与Callable区别

Runnable不可以抛出异常,Callable可以;
Runnable不可以返回结果,Callable可以,结合FutureTask可以拿到结果,但会把当前线程阻塞。

1.2.5实例变量与线程安全

A.不共享数据的情况,不存在这个数据线程安全问题。
B.共享数据的情况,会存在数据线程安全问题。
这个时候需要给run方法加上synchronized关键字,防止线程间操作出现数据错乱。

1.3 currentThread()方法

获取当前线程信息

1.4 isAlive()方法

判断当前的线程是否出于活动状态。

1.5 sleep()方法

指定毫秒数线程休眠

1.6 getId()方法

获取线程唯一标识。

1.7 停止线程

interrupt()方法停止线程,仅仅是当前线程中打一个停止的标志,并不是真的停止线程。
this.interrupted():测试当前线程是否已经中断。 类方法
this.isInterrupted():测试线程是否已经中断。实例方法

异常可以中断线程。
stop暴力停止,已经作废,因为可能导致一些清理性工作得不到完成。另外一个是对锁定的对象进行了解锁导致数据得不到同步处理出现数据不一致的问题。
interrupt()与return结合使用也能实现停止线程。

1.8 暂停线程

暂停线程意味着此线程可以恢复运行。可以使用suspend()方法停止线程,resume()方法恢复线程运行。
但是suspend和resume方法使用不当,容易造成公共的同步对象独占,使得其他线程无法访问公共同步对象,容易导致数据不同步。

1.9 yield方法

yield方法的作用是放弃当前的CPU资源,将让给其他任务去使用CPU。但放弃的时间不确定,有可能马上又获取了CPU的时间片。

1.10 线程的优先级

线程具有优先级具有继承性。
可以通过setPriority()方法可以设置线程优先级。具有规则性:优先级高的总是大部分优先执行完,但不代表高优先级的线程全部执行。
具备随机性:不一定能保障高优先级每次都优先执行。

1.11 线程分类

分为用户线程、守护线程。
守护线程是一种特殊线程,它的线程有陪伴的含义,当进程不存在非守护线程时,则守护线程自动销毁。
比如守护线程最典型的就是GC(垃圾回收器)

总结:
这里主要提到了是线程的基本知识,需要上面有些代码我没有贴出来,主要一个是太简单,另外一个原因是希望读者能够动起手来来自己尝试写代码检测。这样有助于对线程知识加深理解。打完手工,最后希望有兴趣的同学能够看看这本书:《JAVA多线程编程核心技术》、《JAVA并发编程》、《JAVA高级编程》。如果我上面有什么错误希望读者能够留言给我,我会第一时间修改,以防止误导读者。

并发编程系列之线程基础知识回顾(代码片段)

并发线程的知识是很重要而且比较杂的知识点,所以需要花不少时间用于整理。本博客整理线程的一些比较重要而且比较基础的知识点,帮忙读者入门,注意只是学习并发编程的一些基础点,要系统学习的是需要多看看书籍还是... 查看详情

markdown多线程编程基础(代码片段)

查看详情

juc并发编程之completablefuture基础用法(代码片段)

目录实现多线程的四种方式方式一:继承Thread类方式二:实现Runnable接口方式三:实现Callable接口方式四:线程池创建异步对象回调方法handle方法 线程串行化 任务组合组合任务单任务完成及执行实现多线程的四... 查看详情

juc并发编程之completablefuture基础用法(代码片段)

目录实现多线程的四种方式方式一:继承Thread类方式二:实现Runnable接口方式三:实现Callable接口方式四:线程池创建异步对象回调方法handle方法 线程串行化 任务组合组合任务单任务完成及执行实现多线程的四... 查看详情

java并发编程之美之并发编程线程基础(代码片段)

什么是线程  进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程至少有一个线程,进程的多个线程共享进程的资源。  java启动main函数其实就是启动... 查看详情

高并发多线程基础之线程池(代码片段)

高并发多线程之线程基础中生命周期、线程封闭、cpu缓存前言本篇文章描述我们jdk给我们提供的线程池;了解为什么使用线程池,有哪些优点,以及几种Executors中提供给我们的工厂创建方法等线程池的原理为什么要使... 查看详情

并发编程之多线程基础-守护线程与非守护线程

守护线程与主线程之间的联系:Java中有两种线程,一种是用户线程,另一种是守护线程。用户线程是指用户自定义创建的线程,主线程停止,用户线程不会停止用户线程属于非守护线程守护线程当进程不存在或主线程停止,守护... 查看详情

网络编程之多线程(代码片段)

线程理论:线程是什么?线程是CPU的基本执行单位线程里面包括就是要执行的代码进程是一个资源单位其中包括了这个程序需要的所有资源就像是一个工厂里面包括了生产所需所有资源线程像一条流水线包含具体的执行步骤一个... 查看详情

c++11多线程编程之线程类(代码片段)

...发程序时,存在诸多的不便。现在C++11中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。C++11中提供的线程类叫做std:: 查看详情

并发编程之多线程(代码片段)

...性,因而不再详细介绍  官网链接:点击进入二、开启线程的两种方式  multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性importtime,random#frommultiprocessingimportProcess 查看详情

并发编程之多线程篇之一(代码片段)

本节主要知识点包括三个方面  一、线程的含义  二、进程和线程的区别  三、开启进程的两种方式 1??什么是线程和多线程?  1、在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程。  ... 查看详情

并发编程多线程基础(代码片段)

目录并发编程(一)多线程基础1、进程和线程的概念2、为什么要使用多线程3、多线程使用的场景4、多线程创建方式4.1、继承Thread类4.2、实现Runable接口4.3、匿名内部类4.4、线程池(后面细说)5、线程的声生命周期5.1、新建5.2、... 查看详情

多线程编程之runnable与callable区别(代码片段)

Runnable@FunctionalInterfacepublicinterfaceRunnable/***Whenanobjectimplementinginterface<code>Runnable</code>isused*tocreateathread,startingthethreadcausestheobject‘s*<code>run</ 查看详情

多线程编程之竟态(代码片段)

...   竟态指计算结果的正确性依赖相对时间顺序和线程的交错,通俗的说就是计算结果与时间有关,对于一个同样的输入,有时候结果正确,有时候结果不正确。     竟态不一定会导致结果错误,只是说有这种... 查看详情

多线程编程之基础概念

一、什么是线程  线程(thread)是进程中某个单一顺序的控制流。也被称为轻量进程(lightweightprocesses)。计算机科学术语,指运行中的程序的调度单位。  一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈... 查看详情

并发编程之多线程基础篇及面试

线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级... 查看详情

java并发编程系列之二线程基础

...文章对并发的理论基础进行了回顾,主要是为什么使用多线程、多线程会引发什么问题及引发的原因,和怎么使用Java中的多线程去解决这些问题。正所谓,知其然知其所以然,这是学习一个知识遵循的原则。推荐读者先行查看... 查看详情

高并发多线程基础之线程间通信与数据共享及其应用(代码片段)

前言本篇文章主要介绍的是java多线程之间如何通信,协同处理任务,以及数据共享,定时任务处理等操作。多线程之间通信的方式在实际开发过程中多个线程同时操作,有两种情况的,数据共享和线程间协作... 查看详情