public class UserService {
public boolean register() {
User user = new User();
user.setName("Mic");
addUser(user);
sendPoints(user);
return true;
}
public static void main(String[] args) {
new UserService().register();
}
private void addUser(User user) {
System.out.println("添加用户:" + user);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void sendPoints(User user) {
System.out.println(" 发 送 积 分 给 指 定 用 户:" + user);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class UserService {
private final ExecutorService single = Executors.newSingleThreadExecutor();
private volatile boolean isRunning = true;
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue(10);
{
init();
}
public void init() {
single.execute(() -> {
while (isRunning) {
try {
User user = (User) arrayBlockingQueue.take();//阻塞的方式获取队列中的数据
sendPoints(user);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
public boolean register() {
User user = new User();
user.setName("Mic");
addUser(user);
arrayBlockingQueue.add(user);//添加到异步
队列
return true;
}
public static void main(String[] args) {
new UserService().register();
}
private void addUser(User user) {
System.out.println("添加用户:" + user);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void sendPoints(User user) {
System.out.println(" 发 送 积 分 给 指 定 用 户:" + user);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在这个案例中,我们使用了 ArrayBlockingQueue 基于数组的阻塞队列,来优化代码的执行逻辑。
|
ArrayBlockingQueue
|
数组实现的有界阻塞队列, 此队列按照先进先出(FIFO)的原则
对元素进行排序。
|
|
LinkedBlockingQueue
|
链表实现的有界阻塞队列, 此队列的默认和最大长度为
Integer.MAX_VALUE。此队列按照先进先出的原则对元素进行
排序
|
|
PriorityBlockingQueue
|
支持优先级排序的无界阻塞队列, 默认情况下元素采取自然顺序
升序排列。也可以自定义类实现 compareTo()方法来指定元素
排序规则,或者初始化 PriorityBlockingQueue 时,指定构造
参数 Comparator 来对元素进行排序。
|
|
DelayQueue
|
优先级队列实现的无界阻塞队列
|
|
SynchronousQueue
|
不存储元素的阻塞队列, 每一个 put 操作必须等待一个 take 操
作,否则不能继续添加元素。
|
|
LinkedTransferQueue
|
链表实现的无界阻塞队列
|
|
LinkedBlockingDeque
|
链表实现的双向阻塞队列
|
public final int getAndIncrement() {
return unsafe.getAndAddInt(this,
valueOffset, 1);
}
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
getAndAddInt
public final int getAndAddInt(Object var1, long var2, int var4) {
int var5;
do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2,
var5, var5 + var4));
return var5;
}
public final int get() {
return value;
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
原文:https://www.cnblogs.com/47Gamer/p/13086931.html