java 大量数据提交时,使用队列定时提交思路的程序实现

本文通过一个具体的例子展示了如何使用Java中的队列和多线程技术来模拟数据的不断提交与定时批量处理过程。具体包括两个线程的交互:一个线程负责随机生成数据并将其添加到队列中,而另一个线程则负责从队列中取出数据进行处理(如插入数据库等),每五秒处理一次,每次处理最多十个元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


思路如下:

一个队列,提交的信息不断的放入队列;

每隔一段时间定时提交一次,不管队列中元素是否达到预定的个数;

 

模拟程序的思路:

开启两个线程,一个模拟数据提交;另一个模拟数据读取(取出来插入数据库);

 

代码如下:

 Thread1.java

package cn.zhangshibo.liaocheng.test;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Random;

public class Thread1 extends Thread {
	Queue<String> queue = new LinkedList<String>();
	private static int m = 1;

	public Thread1(Queue<String> queue) {
		this.queue = queue;
	}

	@Override
	public synchronized void run() {
		while (true) {
			Random rnd = new Random();
			int len = rnd.nextInt(10);// 每次随机生产10个一下个元素加入队列

			for (int i = 0; i < len; i++) {
				queue.offer("element:" + (m++));
			}
			System.out.println("当前运行的线程是:" + Thread.currentThread().getName() + "\t 本次新加入元素数:" + len + "\t 队列中元素总数是:"
					+ queue.size());
			try {
				Thread.sleep(rnd.nextInt(5000));// 随机休眠5秒之内的时间
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}


Thread2.java

package cn.zhangshibo.liaocheng.test;

import java.util.LinkedList;
import java.util.Queue;

public class Thread2 extends Thread {
	private Queue<String> queue = new LinkedList<String>();
	private static int j = 1;

	public Thread2(Queue<String> queue) {
		this.queue = queue;
	}

	public synchronized void run() {
		while (true) {
			String str;
			while (!queue.isEmpty()) {
				int k = 10;// 每次提交数设置为10,可以根据需要修改
				while ((str = queue.poll()) != null) {

					--k;
					System.out.println(k + "\t" + str);
					if (k == 0) {
						break;
					}
				}

				System.out.println("当前运行的线程是:" + Thread.currentThread().getName() + "\t 第" + j + "次提交!队列还剩元素数:"
						+ queue.size());
				j++;
				try {
					Thread.sleep(5000);// 每次提交以后休眠5秒
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}


Test.java

package cn.zhangshibo.liaocheng.test;

import java.util.LinkedList;
import java.util.Queue;

public class Test {
	public static void main(String[] args) {
		Queue<String> queue = new LinkedList<String>();
		// 创建两个线程,让其不间断运行
		Thread1 t1 = new Thread1(queue);// 线程1模拟随机添加元素
		Thread2 t2 = new Thread2(queue);// 线程2模拟每隔5秒每次提交10个元素

		t1.setName("线程一");
		t2.setName("线程二");

		t1.start();
		t2.start();
	}
}


 

运行结果:

当前运行的线程是:线程一  本次新加入元素数:8  队列中元素总数是:7
9 element:1
8 element:2
7 element:3
6 element:4
5 element:5
4 element:6
3 element:7
2 element:8
当前运行的线程是:线程二  第1次提交!队列还剩元素数:0
当前运行的线程是:线程一  本次新加入元素数:4  队列中元素总数是:4
当前运行的线程是:线程一  本次新加入元素数:4  队列中元素总数是:8
当前运行的线程是:线程一  本次新加入元素数:0  队列中元素总数是:8
9 element:9
8 element:10
7 element:11
6 element:12
5 element:13
4 element:14
3 element:15
2 element:16
当前运行的线程是:线程二  第2次提交!队列还剩元素数:0
当前运行的线程是:线程一  本次新加入元素数:6  队列中元素总数是:6
9 element:17
8 element:18
7 element:19
6 element:20
5 element:21
4 element:22
当前运行的线程是:线程二  第3次提交!队列还剩元素数:0
当前运行的线程是:线程一  本次新加入元素数:2  队列中元素总数是:2
当前运行的线程是:线程一  本次新加入元素数:3  队列中元素总数是:5
9 element:23
8 element:24
7 element:25
6 element:26
5 element:27
当前运行的线程是:线程二  第4次提交!队列还剩元素数:0
当前运行的线程是:线程一  本次新加入元素数:5  队列中元素总数是:5
当前运行的线程是:线程一  本次新加入元素数:5  队列中元素总数是:10
9 element:28
8 element:29
7 element:30
6 element:31
5 element:32
4 element:33
3 element:34
2 element:35
1 element:36
0 element:37
当前运行的线程是:线程二  第5次提交!队列还剩元素数:0
当前运行的线程是:线程一  本次新加入元素数:5  队列中元素总数是:5
当前运行的线程是:线程一  本次新加入元素数:8  队列中元素总数是:13
9 element:38
8 element:39
7 element:40
6 element:41
5 element:42
4 element:43
3 element:44
2 element:45
1 element:46
0 element:47
当前运行的线程是:线程二  第6次提交!队列还剩元素数:3
当前运行的线程是:线程一  本次新加入元素数:5  队列中元素总数是:8
9 element:48
8 element:49
7 element:50
6 element:51
5 element:52
4 element:53
3 element:54
2 element:55
当前运行的线程是:线程二  第7次提交!队列还剩元素数:0
当前运行的线程是:线程一  本次新加入元素数:3  队列中元素总数是:3
当前运行的线程是:线程一  本次新加入元素数:8  队列中元素总数是:11
当前运行的线程是:线程一  本次新加入元素数:1  队列中元素总数是:12
9 element:56
8 element:57
7 element:58
6 element:59
5 element:60
4 element:61
3 element:62
2 element:63
1 element:64
0 element:65
当前运行的线程是:线程二  第8次提交!队列还剩元素数:2
当前运行的线程是:线程一  本次新加入元素数:0  队列中元素总数是:2
当前运行的线程是:线程一  本次新加入元素数:4  队列中元素总数是:6
当前运行的线程是:线程一  本次新加入元素数:5  队列中元素总数是:11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值