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

多线程

目录

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关键字,将方法声明称线程安全的
发布了29 篇原创文章 · 获赞 33 · 访问量 5103

猜你喜欢

转载自blog.csdn.net/lxn1214/article/details/104802428