![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
万小猿
这个作者很懒,什么都没留下…
展开
-
实现一个定时任务管理器
一、定时任务管理器 我们把我们的任务A,B,C分别延时多久后执行。因为我这个定时任务管理器,肯定不会干扰我们主线程,自己开一个线程去执行。 这个线程的功能就是,先到时间的先执行。因此我们在进行放入任务的时候,就要把过期时间排好序。我这边采用的优先队列进行按照过期时间升序排列。二、代码TimerTask:每个定时任务类@Data@AllArgsConstructorpublic class TimerTask { private int taskId; //时..原创 2021-09-19 22:54:01 · 649 阅读 · 0 评论 -
对海量数据进行排序
一、问题描述 对于很多数据,我们内存是放不下的,因此我们不能按照以往的那种直接用快排或者调用.sort函数就解决了。大概的方法有这些。二、解决方法1.位图法先申请一个二进制数组,其大小为有可能出现的最大的整数值,如500万,如图所示。假设5个整数组成的序列{2,3,200,7000,12000},则我们可以将这个序列保存在二进制数组当中,第n位如果为1,则表示n存在于这个序列中:然后在根据这个二进制数组转化为整数,依次从小到大排序更新到外部文件。代码:...原创 2021-08-30 15:20:23 · 2079 阅读 · 0 评论 -
5条线程轮流打印1~100
一、问题解析 既然是轮流打印,说明每个线程只能做自己的事情,只有满足了自己打印的要求才去打印,所以自然我们就会想到取模,根据取模的结果去触发打印机制。二、代码class PrintNumber extends Thread { private static volatile int cnt = 0; private int id; // 线程编号 public PrintNumber(int id) { this.id = id; }..原创 2021-08-30 14:02:02 · 478 阅读 · 0 评论 -
生产者消费者模型(自己上锁与阻塞队列两版本)
一、什么是生产者消费者模型 生产者与消费者模式就是一个多线程并发协作的模式,在这个模式中呢,一部分线程被用于去生产数据,另一部分线程去处理数据,于是便有了形象的生产者与消费者了。而为了更好的优化生产者与消费者的关系,便设立一个缓冲区,也就相当于一个数据仓库,当生产者生产数据时锁住仓库,不让消费者访问,当消费者消费时锁住仓库,不让生产者访问仓库。举一个简单的例子,有一个生产者生产包子,他将生产好的包子放到筐中,放完包子由消费者从筐中拿出包子使用。当然筐还有一个作用就是当筐中没有包子时便锁住筐,不让消..原创 2021-08-28 22:22:55 · 346 阅读 · 0 评论 -
多个文件进行合并取前10个数(多线程方式)
一、问题 现在有20个文件,他们存着数字,每个文件的大小都是大于系统内存的。要求用线程池,用5个线程去进行处理。将20个文件的数字排名前10取出来二、思路 1.想想用什么数据结构存储这个前10的数,这边采用优先队列的阻塞队列 2.每个线程去取数据的时候,比如取了A,分两种情况:1.如果阻塞队列长度小于10,直接压入;2.如果大于10,一直移除,直到队列长度为10;3.队列长度等于10,那么我A就和阻塞队列的最小值比较,如果大于那么就移除最小值,然后压入A。 3.线程跑完后,...原创 2021-08-18 14:38:52 · 233 阅读 · 0 评论 -
多线程打印ABCD顺序(带有线程池实现)
一、问题 4个线程去依次顺序打印出ABCD,为了保证打印出A后,需要打印B,那么我们肯定是A线程执行后,是定点唤醒B线程,所以自然就会用到CONDITION的await和signal二、代码public class CirPrinterTest implements Runnable { //成员变量 //打印次数;打印条件;触发下一个指定线程打印;打印的字符;定点唤醒的锁 int printCount; Condition thisCondition..原创 2021-08-17 22:01:09 · 705 阅读 · 0 评论 -
简易版的等待/唤醒方法(sleep,wait,await,park区别)适合面试回答
1. Thread的Sleep()方法:必须要指定时间:;需要捕获异常;不会释放锁2. Object的wait()方法和notify()方法:必须配合sychronized关键字使用;notify()方法在wait()方法之后执行,否则会丢失唤醒信号;需要捕获异常;会释放锁3. Condition接口的await()与Signal()方法:必须配合lock.lock()方法使用:主要是可以定点唤醒。4.LockSupport的park()和unpark(thread)方法:不需要捕获异常;不会释原创 2021-08-13 11:14:48 · 291 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore的区别
CountDownLatch原理减法计数器,CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每个线程完成自己任务后,计数器的值就会减一。当计数器的值为0的时候,表示所有的线程都已经完成任务,然后在CountDownLatch上等待的线程就可以恢复接下来的任务了。经典用法:1.某个线程在开始运行前等待n个线程执行前完毕。将CountDwonLatch的计数器初始化后,每当一个任务线程执行完毕后...原创 2021-07-24 16:35:10 · 247 阅读 · 0 评论 -
通俗有趣讲解Atomic原子类的实现原理
线程安全真的是线程的安全吗? 什么是 Atomic? 实现一个计数器 AtomicInteger 源码分析 AtomicLong 和 LongAdder 谁更牛? 总结 当我们谈论『线程安全』的时候,肯定都会想到 Atomic 类。不错,Atomic 相关类都是线程安全的,在讲 Atomic 类之前我想再聊聊『线程安全』这个概念。线程安全真的是线程的安全吗?初看『线程安全』这几个字,很容易望文生义,这不就是线程的安全吗?其实不是,线程本身没有..转载 2021-06-29 20:41:09 · 470 阅读 · 0 评论 -
Java多线程讲解,超详细!可获取相关笔记
七、多线程7.1什么是线程和进程?7.1.1进程进程是程序的一次执行过程,是系统运行的基本单位,因此进程是动态的(很多次执行)。系统运行一个程序是一个进程创建、运行到消亡的过程。在JAVA中,当我们启动Main函数其实就是启动了一个JVM的进程,而Main函数所在的线程就是这个进程中的一个线程,也称为主线程。在Windows中,我们可以通过任务管理器看我们电脑运行着这那些进程。7.1.2线程线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行过程中可以产生多个线程.原创 2021-03-23 21:10:24 · 4613 阅读 · 2 评论