Java多线程

概念

线程:操作系统能够进行运算调度的最小单位。被包含在进程中,是进程的实际运作单位。
应用软件中互相独立,可以同时运行的功能

并发:在同一时刻,有多个指令在单个CPU上交替 执行

并行:在同一时刻,有多个指令在多个CPU上同时执行

Runtime runtime = Runtime.getRuntime();

//获取当前电脑的CPU数量(核心数)

int cpuNum = runtime.availableProcessors();

System.out.println("当前有CPU的个数="+cpuNum);

开启线程->最终执行run方法

run方法是一个普通的方法,没有真正的启动一个线程,会把run方法执行完毕才向下执行

调用start()方法才能启动线程

为什么调用start

public sybchronized void start(){

start0();

}

start0()是本地方法,JVM调用,底层是c/c++实现

真正实现多线程的效果是start0(),而不是run

当main线程启动一个子线程,主线程不会阻塞,会继续执行

主线程和子线程交替执行...

多线程实现方法

1.继承thread类

1.定义一个类继承thread

2.重写run方法

3.创建子类对象,并启动线程

优点:编程简单,可以直接使用Thread类中的方法

缺点:可以扩展性较差,不能再继承其他的类

2.实现runnable接口

1.定义一个类实现runnable接口

2.重写run方法

3.创建thread类对象,并启动线程

优点:扩展性较强,实现接口的同时还可以继承其他类

缺点:编程相对复杂,不能直接使用thread类中的方法

3.利用callable接口和future接口

可以获取多线程运行的结果

1.创建一个类MyCallable实现Callable接口

2.重写call(有返回值,表示多线程运行的结果)

3.创建MyCallable对象(表示多线程要执行的任务)

4.创建FutureTask对象(作用管理多线程运行的结果)

5.创建Thread类对象,并启动(表示线程)

优点:扩展性较强,实现接口的同时还可以继承其他类

缺点:编程相对复杂,不能直接使用thread类中的方法

线程的生命周期

锁对象一定是唯一的

synchronized写在循环里面

同步方法

就是把synchronized关键字加到方法上

特点:

同步方法是锁住方法里面的所有代码

锁对象不能自己指定

非静态:this

静态:当前类的字节码文件对象

线程同步机制

1.在多线程中,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。

2.线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。

用户线程和守护线程

1.用户线程:也叫工作线程,当线程的任务执行或通知方式结束

2.守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束

常见守护线程:垃圾回收机制

Lock锁

JDK5之后提供了一个新的锁对象lock

lock中提供了获得锁和释放锁的方法

void lock():获得锁

void unlock():释放锁

手动上锁,手动释放锁

lock是接口不能直接实例化,采用实现类ReentrantLock来实例化

ReentrantLock的构造方法

ReentrantLock():创建一个ReentrantLock的实例

互斥锁

保证共享数据操作的完整性。

保证在任一时刻,只能有一个线程访问该对象

关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任意时刻只能由一个线程访问

同步的局限性:导致程序的执行效率要降低

同步方法(非静态)的锁可以是this,也可以是其他对象(要求是同一个对象)。

同步方法(静态)的锁为当前类本身

同步方法没有使用static修饰:默认锁对象为this

如果方法使用static修饰,默认锁对象:当前类.class

等待唤醒机制(生产者和消费者)

生产者和消费者是一个十分经典的多线程协作的模式

阻塞队列方式实现

put数据时:放不进去,等着,也叫阻塞

take数据时:取出第一个数据,取不到也会等着,也叫阻塞

线程池

1.创建一个池子,池子中是空的

2.提交任务时,池子会创建新的线程对象,任务执行完毕,线程池归还给池子

下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可

3.但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

相关推荐
QQ同步助手2 分钟前
C++ 指针进阶:动态内存与复杂应用
开发语言·c++
信徒_4 分钟前
常用设计模式
java·单例模式·设计模式
凯子坚持 c8 分钟前
仓颉编程语言深入教程:基础概念和数据类型
开发语言·华为
神仙别闹9 分钟前
基于C#实现的(WinForm)模拟操作系统文件管理系统
java·git·ffmpeg
小爬虫程序猿10 分钟前
利用Java爬虫速卖通按关键字搜索AliExpress商品
java·开发语言·爬虫
程序猿-瑞瑞12 分钟前
24 go语言(golang) - gorm框架安装及使用案例详解
开发语言·后端·golang·gorm
qq_4335545412 分钟前
C++ 面向对象编程:递增重载
开发语言·c++·算法
组合缺一15 分钟前
Solon v3.0.5 发布!(Spring 可以退休了吗?)
java·后端·spring·solon
程序猿零零漆17 分钟前
SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法
java·spring cloud·mybatis-plus
猿来入此小猿19 分钟前
基于SpringBoot在线音乐系统平台功能实现十二
java·spring boot·后端·毕业设计·音乐系统·音乐平台·毕业源码