java 设计与解决方案
多条请求 -到-》java服务每次批量最多2个并行处理能力。剩余的请求则进入队列排队,同步等待。
有什么实现方式和思路呢
搞个线程池,只给两个线程处理请求
其所谓的编译过程只是将.java文件编程成平台无关的字节码.class文件,
并不是向C一样编译成可执行的机器语言,注意Java中所谓的“编译”和传统的“编译”的区别。
作为编译型语言,JAVA程序要被统一编译成字节码文件——文件后缀是.class。此种文件在java中又称为类文件。
java类文件不能在计算机上直接执行,它需要被java虚拟机翻译成本地的机器码后才能执行,而java虚拟机的翻译过程则是解释性的。
java字节码文件首先被加载到计算机内存中,然后读出一条指令,翻译一条指令,执行一条指令,该过程被称为java语言的解释执行,是由java虚拟机完成的。
以上说的是Java的解释执行,但是比如我们大多数情况使用的Hotspot JVM,都提供了动态编译器JIT,能够追踪热点代码, 然后变成机器指令,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
针对该问题,可以采用以下设计和实现方案:
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.ReentrantLock;
public class MyQueue {
private Queue<Task> taskQueue;
private ReentrantLock lock;
public MyQueue() {
taskQueue = new ArrayBlockingQueue<>(100);
lock = new ReentrantLock();
}
/* 将Task加入队列 */
public void enqueue(Task task) {
lock.lock();
try {
taskQueue.offer(task);
} finally {
lock.unlock();
}
}
/* 取出队列中的一个Task */
public Task dequeue() {
lock.lock();
try {
if (taskQueue.isEmpty()) {
return null;
} else {
return taskQueue.poll();
}
} finally {
lock.unlock();
}
}
/* 获取队列大小 */
public int size() {
lock.lock();
try {
return taskQueue.size();
} finally {
lock.unlock();
}
}
/* 线程池处理任务 */
public void process() {
ExecutorService executorService = Executors.newFixedThreadPool(3);
while (true) {
Task task;
// 优先处理批量任务
for (int i = 0; i < 2; i++) {
task = dequeue();
if (task != null && task.isBatch()) {
executorService.submit(task);
}
}
// 处理非批量任务
task = dequeue();
if (task != null) {
executorService.submit(task);
}
}
}
}
class Task implements Runnable {
private boolean isBatch;
// 具体的业务逻辑
// ...
public Task(boolean isBatch) {
this.isBatch = isBatch;
}
public boolean isBatch() {
return isBatch;
}
@Override
public void run() {
// 业务逻辑的具体实现
}
}
以上就是一个可行的队列排队的解决方案。该方案可以处理并发请求,同时保证所有请求都被处理,而且不会有请求丢失。具体实现上还要根据实际情况来进行优化和扩展。