Java多线程

什么是多线程

有了多线程,我们可以让程序同时做多件事情。

多线程作用

提高效率

并发

同一时刻,有多个指令在单个cup上交替执行

并行

同一时刻,多个指令在多个cpu上同时执行

多线程实现的方式

继承Thread类重写run方法

实现Runnable接口实现run方法

利用Callable接口和Future接口实现,有返回值

前两种方式比较接单,以第三个为例子:

利用Callable

复制代码
public class MyT implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int a = 0;
        for (int i = 0; i < 100; i++) {
            a = a + i;
        }
        return a;
    }
}

Future

复制代码
MyT myT = new MyT();
FutureTask<Integer> f = new FutureTask<>(myT);
Thread t = new Thread(f);
t.start();
System.out.println(f.get());

Thread常用成员方法

String getName() 获取此线程的名称

void setName(String name) 设置线程名字

static Thread currentThread() 获取当前线程对象

static void sleep(long time) 让线程休眠指定时间,单位为毫秒

setPriority(int newPriority) 设置线程优先级

默认值为5,优先级越高,获取cpu概率越高,取值范围(1-10)

final int getPriority() 获取线程优先级

final void setDaemon(boolean on) 设置为守护线程

当主线程结束,守护线程会陆续结束。(但不会立刻停止)

public static void yield() 出让线程(让出cpu的执行权力,让其它线程执行)

public static viod join() 插入线程(插入的线程先执行完,在执行其它的线程)

同步代码块

synchronized(锁) {

}

同步方法

修饰符 synchronized 返回值类型 方法名(方法参数) {}

锁对象不能指定

非静态:this

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

Lock锁

Lock实现提供比使用synchronized方法和语句可以获取更广泛的锁定操作。

void lock() 获取锁

void unlock() 释放锁

Lock是接口,不能直接实例化,通过ReentrantLock来实现。

生产者和消费者

void wait() 当前线程等待,直到被其它线程唤醒

void notify() 随机唤醒单个线程

void notifyAll() 唤醒所有线程

阻塞队列

ArrayBlockingQueue 底层是数组有界

LinkeBlockingQueue 底层为链表,无界(最大为int最大值)

线程状态

新建状态 创建线程

就绪状态 start方法,开启线程

阻塞状态 没有获取锁对象

等待状态 wait方法

计时等待 sleep

结束状态 run方法执行完毕

线程池

Executors线程池的工具类,通过调用不同的方法返回不同的线程池。

public static ExecutorService newCachedThreadPool() 创建一个没有上限的线程池

public static ExecutorService newFixedThreadPool(int nThreads) 创建有上限的线程池

自定义线程池

1.核心线程数量

2.最大线程数

3.空闲线程最大存活时间

4.时间单位

5.任务队列

6.创建线程工厂

7.任务的拒绝策略

注意

当核心线程满,再提交任务,会在队列中排队。

当核心线程满、队列排队满,再提交任务会创建临时线程。(提交任务的顺序,不一定是执行顺序)

当核心线程满、队列排队满、创建临时线程满,在提交任务会触发任务的拒绝策略。

相关推荐
名字还没想好☜2 分钟前
Next.js Route Handler 做 SSE 服务端推送:实时进度条、自动重连与什么时候别用 WebSocket
开发语言·javascript·websocket·react·sse·next.js
数据库技术讲堂2 分钟前
从 GitOps 到数据库变更:NineData 如何打通 CI/CD 的数据库治理链路
java·数据库·ci/cd
进制树4 分钟前
【飞控开发实战·㉒】ROS2无人机应用开发实战:Offboard控制、航点任务、AprilTag降落与避障系统
开发语言·安全·无人机·课程设计
深海呐14 分钟前
Java 位运算符的实际应用:不止面试刷题,业务同样能用
java·位运算符·java 位运算·java 开发技巧·状态位设计·java 高阶用法·位运算符实战
江畔柳前堤14 分钟前
LLM + Agent 模型效果评估:从入门到工业级体系构建的完整指南
开发语言·人工智能·自然语言处理·chatgpt·架构·json·batch
2602_9599609215 分钟前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题
路多辛17 分钟前
一个 Go 写的全能 AI Agent,讲讲 covo-agent
java·开发语言·golang
杨丰玮41821 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(四)
java·游戏·计算机外设
阿沐沐,25 分钟前
PowerShell 里改了 config.toml,Codex CLI 仍用旧值:先分清该改哪一层
java·服务器·数据库·人工智能·ai·ai编程
杨丰玮41827 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(二)
java·游戏·计算机外设