前言
环境准备:jdk1.8
任务队列选取:concurrentqueue任务队列,原因是:效率高,线程安全。
线程池选取:FixedThreadPool。
代码
1,创建实体类User
@Data
public class User {
private String name;
private String age;
public User(String name, String age) {
this.name = name;
this.age = age;
}
}
2,创建全局类Glob,存放任务队列,这里使用的是懒汉式。
@Data
public class Glob {
private static Glob glob = new Glob();
private ConcurrentLinkedQueue queue = new ConcurrentLinkedQueue<Map<String, User>>();
public Glob getInstance(){
return glob;
}
}
3,创建放任务线程PushThread,这个线程会将任务放到任务队列里面,存放到内存中。可以通过全局类获取,后面会有所使用。
public class PushThread implements Runnable {
@Override
public void run() {
Map map1 = new HashMap();
ConcurrentLinkedQueue queue = new Glob().getInstance().getQueue();
map1.put("jack",new User("jack","23"));
Map map2 = new HashMap();
map2.put("rose",new User("rose","22"));
queue.add(map1);
queue.add(map2);
}
}
3,创建取任务线程PullThread。
public class PullThread implements Runnable {
@Override
public void run() {
ConcurrentLinkedQueue queue = new Glob().getInstance().getQueue();
Map map = new HashMap();
while ((map = (Map) queue.poll()) != null){
System.out.println(map);
}
}
}
测试,使用线程池的时候需要注意:使用完之后关闭线程池。
@Test
public void test3() throws InterruptedException {
ExecutorService fixedThreadPool =Executors.newFixedThreadPool(3);
// todo 创建pushThread
// todo 创建pollThread
fixedThreadPool.execute(new PushThread());
// 先创建队列完成再取
Thread.sleep(1000);
fixedThreadPool.execute(new PullThread());
fixedThreadPool.shutdown();
}