Java高并发程序设计(1)

序言

创建线程的两种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。这两种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。

如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。

而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执行结果。

1.1、Runnable接口

它是一个接口,里面只声明了一个run()方法:

public interface Runnable {
    public abstract void run();
}

由于run()方法返回值为void类型,所以在执行完任务之后无法返回任何结果。

1.2、Callable接口

Callable接口位于java.util.concurrent包下,在它里面也只声明了一个方法,只不过这个方法叫做call()。

public interface Callable<V> {   
    V call() throws Exception;
}

是一个泛型接口,call()函数返回的类型就是传递进来的V类型。Callable接口可以看作是Runnable接口的补充,call方法带有返回值,并且可以抛出异常。

 

Java计数器之CountDownLatch、CyclicBarrier、Semaphore

CyclicBarrier

java并发之同步辅助类(Semphore、CountDownLatch、CyclicBarrier、Phaser)

https://www.cnblogs.com/uodut/p/6830939.html

 

高并发情况下存在的问题

定时器刷新静态类

要使用线程安全的字典

 

原子性

可见性

有序性

 

常见四种并发的模式

Threads: 一个任务创建一个新的线程,线程创建销毁开销比较大,一般用的比较少。

Executors: 一个任务队列复用多个线程,减少了线程的创建和销毁的次数,常用。

ForkJoin: 多个任务队列加多个线程,一个线程正常只消费一个队列,自己的任务结束了可以窃取其他线程队列的任务,减少了线程对队列的竞争,java8并行流常用。

Actors: 一般一个任务队列加一个线程,单个actor串行消费队列的消息,几乎没有并发的冲突。可以通过actor分片提高任务的并行执行。

 

Akka

 

 

在一个方法中同时调用多个方法或者服务,并等待所有结果返回

并发偏重于多个人数交替进行,而多个任务之间,有可能还是串行。

并行是真正意义的同时进行。

多线程的原子性、可见性、有序性。

不要使用stop()方法终止线程

内部锁、重入锁、信号量、读写锁

Fork/Join框架

 

JUC(并发编程)

 

资料

https://www.sohu.com/a/270127232_575744

https://www.cnblogs.com/bjlhx/p/9734963.html

posted @   ~沐风  阅读(548)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2016-07-03 Python入门系列教程(一)基础

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示