思路如下:
一个队列,提交的信息不断的放入队列;
每隔一段时间定时提交一次,不管队列中元素是否达到预定的个数;
模拟程序的思路:
开启两个线程,一个模拟数据提交;另一个模拟数据读取(取出来插入数据库);
代码如下:
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