Java多线程

并发与并行

  • 并发:指两个或多个事件在同一个时间段内发生
  • 并行:指两个或多个事件在同一时刻发生(同时发生)
    在这里插入图片描述
    在这里插入图片描述

进程与线程

  • 进程:是指一个内存中运行的应用程序
  • 线程:线程是进程中的一个执行单元,负责当前进程中程序的执行

Thread类中的常用方法

String getName()返回该线程的名称
static Thread currentThread()返回对当前正在执行的线程对象的引用
void setName(String name)改变线程的名称,使之与参数name相同
Thread(String name)调用父类的带参构造方法,把线程名称传递给父类
public static void sleep(long millis)使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)

多线程实现步骤
第一种

  1. 创建一个Thread类的子类
  2. 在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么)
  3. 创建Thread类的子类对象
  4. 调用Thread类中的方法start方法,开启新的线程,执行run方法

第二种

  1. 创建一个Runnable接口的实现类
  2. 在实现类中重写Runnable接口的run方法,设置线程任务
  3. 创建一个Runnable接口的实现类对象
  4. 创建Thread类对象,构造方法中传递Runnable接口的实现类对象
  5. 调用Thread类中的start方法,开启新的线程执行run方法

解决线程安全问题

1.同步代码块

synchronized(锁对象){
	可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意

 1. 通过代码块中的锁对象,可以使用任意的对象
 2. 但是必须保证多个线程使用的锁对象是同一个
 3. 锁对象作用:把同步代码块锁住,只让一个线程在同步代码块中执行

2.同步方法
格式:定义方法的格式
修饰符 synchronized 返回值类型 方法名(参数列表){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
同步方法也有锁对象,就是实现类this
静态同步方法的锁对象为本类的class属性

3.Lock锁

Lock接口中的方法:
void Lock()获取锁
void unLock()释放锁

使用步骤:
	1.在成员位置创建一个ReentrantLock
	2.在可能出现安全问题的代码前调用Lock接口中的方法Lock获取锁
	3.在可能出现安全问题的代码后调用Lock接口中的方法unLock释放锁

线程状态
在这里插入图片描述
进入到TimeWaiting(计时等待)有两种方式

1.sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
2.wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态

唤醒方法:

void notify()唤醒在此对象监视器上等待的单个线程
void notifyAll()唤醒在此对象监视器上等待的所有线程

线程间通信
概念:多个线程在处理用一个资源,但是处理的动作(线程的任务)却不同

线程池
就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源

合理利用线程池的好处

  1. 降低资源消耗,减少了创建和销毁线程的次数
  2. 提高响应速度,当任务到达时,任务可以不需要等到线程创建就能立即执行
  3. 降低线程的可管理性,可以根据系统的承受能力,调整线程池中的数目,防止内存消耗过多

import java.util.concurrent.Executors;线程池的工厂类,用来生成线程池
Executors类中的静态方法:

static ExecutorService newFixedThreadPool(int nThreads)创建一个可重用固定线程数的线程池
参数表示线程池中线程的数量
返回值返回的是ExecutorService接口的实现类对象

import java.util.concurrent.ExecutorService;线程池接口
用来从线程池中获取线程,调用start方法,执行线程任务

Future<?> submit(Runnable task)提交一个Runnable任务用于执行(返回的Future什么东西不是很懂)
void shutdown()关闭/销毁线程池的方法

线程池的使用步骤:

  1. 使用线程池的工厂类Executors里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
  2. 创建一个类,实现Runnable接口,重写run方法,设置线程任务
  3. 调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
  4. 调用ExecutorService中的方法shutdown销毁线程池(不建议)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

P_xuebuhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值