并发编程你知道多少?
郑重声明: 本文首发于人工博客
1、导读
现在物理机器的配置越来越高。在按照传统的多线程编程模型去开发的,机器的资源是极大的浪费;性能优化更是别谈。所以掌握并发编程的技巧是区别初级程序员和高级程序员的一个重要标准。
ThreadPoolExecutor 复用线程的创建。
信号量 Semaphore 是控制并发的数量的。
程序计数器 CountDownLatch 是异步转同步,确保程序所有的子线程都完毕了。
2、什么是并发编程
所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。并发编程其实就是合理利用cpu多核的特性,让程序并发去执行一段相关的逻辑。达到的效果是总的是时长不是每个步骤的时长的综合。而有可能是单个步骤时长的最大者。
3、常见问题
3.1、如何并发
简单的并发其实就是创建线程池,把任务扔给线程池去执行。但是往往因为线程池使用不当导致的各种,而且难以排查。针对这个问题。参考我这篇文章线程池的使用
3.2、如何限流
受物理机的现在,并发不能无限制。为了保护程序,我们必须限流。这里最常用的就是信号量Semaphore
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class StudySemaphore {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
//信号量,只允许 3个线程同时访问
Semaphore semaphore = new Semaphore(3);
for (int i=0;i<10;i++){
final long num = i;
executorService.submit(new Runnable() {
@Override
public void run() {
try {
//获取许可
semaphore.acquire();
//执行
System.out.println("Accessing: " + num);
Thread.sleep(new Random().nextInt(5000)); // 模拟随机执行时长
//释放
semaphore.release();
System.out.println("Release..." + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
executorService.shutdown();
}
}
3.3、等待异步线程执行完毕
一个功能分十个步骤,我们并发执行。我们需要的是十个步骤全都执行完毕。再去返回结果。那怎么知道已经所有的线程都执行完毕流。程序计数器可能能祝你一臂之力 CountDownLatch
public class CountDownLatchTest {
¨K12K
}
```
版权声明:本文为人工博客的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接:https://www.gzcx.net/article/1749
正文到此结束