Java多线程的初识与简单的安全问题解决

Ora ·
更新时间:2024-11-14
· 907 次阅读

多线程 目录 进程 进程的了解 线程 什么是线程 线程的组成 线程的创建 线程的状态 线程的方法 线程的安全问题 1.进程 1.1.进程的了解 简单的来说进程就是运行中的程序,简称为进程。 单核CPU在任意一个时间节点上,只能运行一个线程。 windows10上通过 快捷键 ctrl+shift+esc组合按键调出任务管理器
在这里插入图片描述
能查出目前正在使用的进程,与后台挂载的进程
win10中通过在cmd中输入wmic打开命令窗口
并输入 cpu get NumberOfCores查询自己电脑核数
简单理解一核一个线程
在这里插入图片描述
上图所示 4代表我的电脑核数 4核说明能同时执行四个进程

注意:单核的宏观并行,微观串行

2.线程 2.1.什么是线程 轻量级的进程 程序中的一个顺序控制流程,也是CPU的基本调度单位 同时也是CPU的基本调度单位,进程由多个线程组成,彼此间完成不同的工作,交替执行,称为多线程。 JVM虚拟机是一个进程,默认包含主线程(Main函数),可通过代码创建多个线程与main并发执行 2.2.线程的组成

任何一个线程都具有基本的组成部分:

CPU时间片:操作系统(OS)会为每个线程分配执行时间。 运行数据:
1. 堆空间:存储线程需使用的对象。多个线程可以共享堆内存
2. 栈空间:存储线程需要使用的局部变量,每个线程都拥有独立的栈 2.3.线程的创建 方式1:
1. 通过继承Thread类
2. 重写run方法
3. 子类对象调用start() public class TestThread{ public static void main(String[] args){ // 3.创建线程 Thread th = new ThreadOne(); // 4.调用线程 th.start(); } } // 线程类 1.继承Thread类 class ThreadOne extends Thread{ // 2.重写run方法 @Override public void run(){ // 这里是线程要执行的内容 } } 方式2:
1. 实现Runnable接口
2. 重写run方法
3. new一个实现接口的类对象
4. 创建线程对象
5. 调用start() public class TestThread{ public static void main(String[] args){ // 3.创建任务 ThreadOne one = new ThreadOne(); // 4.创建线程 Thread th = new Thread(one); // 5.调用线程 th.start(); } } // 线程类 1.继承Thread类 class ThreadOne implements Runnable{ // 2.实现run方法 @Override public void run(){ // 这里是线程要执行的内容 } } 其他方式这里不做详细的解释列出 2.4.线程的状态 初始状态 New 就绪状态 Ready 运行状态 Running 终止状态 Terminated 阻塞状态 Blocked 限期等待 Timed Waiting 无限期等待Waiting
JDK 1.5之后就绪状态与运行状态统称Runnable

在这里插入图片描述

2.5.线程的常见方法

休眠

public static void sleep(long millis) 当前线程主动休眠Millis毫秒

放弃

public static void yield() 当前线程主动放弃时间片,回到就绪状态,竞争下一次时间片。

结合:

public final void join() 允许其他线程加入到当前线程中

join是无限期等待:等待条件为调用join方法的线程执行完毕后!再进入就绪状态,竞争时间片

在这里插入图片描述

更多的方法请自行查找java 1.8 api

3.线程的安全问题 当多线程并发访问临界资源时,如果破环原子操作,可能会造成数据不一致 临界资源:共享资源(同一对象),一次仅允许一个线程使用,才可保证其正确性 原子操作:不可分割的多步操作,被视为一个整体,其顺序和步骤不可打乱或者缺省

例如:银行存取钱案例。
这里给出两种解决方法

方法一、synchronized(){}同步代码块 方法二、在方法上加上 synchronized关键字,将方法声明称线程安全的
作者:敢敢-李



JAVA 线程 java多线程

需要 登录 后方可回复, 如果你还没有账号请 注册新账号