我有一个与java相关的查询,因为我有两个并行调用方法的服务,我希望当我的一个服务在哪个服务器上运行时它应该正常运行,但是如果请求来自第二个服务它应该开始处理该服务的请求,我的意思是服务中的线程不应该丢失,我可以使用java 8实现这一点。 一个解决方案,我认为我可以创建一个包含100个线程的线程池并分配80个线程来为一个服务,另一个20个服务到另一个服务,但我有一个问题,假设我的所有80个线程都被服务使用了一个然后我不会有处理器来处理来自第二服务的请求, 请在我们需要的时候提供这个问题的解决方案,如果它在java 8中会更好
答案 0 :(得分:0)
你可以创建一个优先的未来任务。在当前的java实现中,没有提供优先级的选项。所以你可以创建你的类
public class PriorityFutureTask<V> extends FutureTask<V> {
private long priority;
//more code
}
- 定义你的线程池,它将扩展ThreadPoolExecutor
。当前线程池执行器也不支持priority.Create自己的线程池扩展
ThreadPoolExecutor
即
public class PriorityThreadpoolImpl extends ThreadPoolExecutor{
//some code.
}
- 当前的ThreadPoolExecutor采用阻塞队列,它以fifo顺序提供数据。你需要修改哪个将轮询具有最高优先级的项目。 在ThreadPool中
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
在您的实施中,修改您的池代码以获取优先级队列。
public PriorityThreadpoolImpl(int poolSize, long defaultPriority) {
super(poolSize, poolSize, 0, TimeUnit.MILLISECONDS,
new PriorityBlockingQueue<Runnable>(poolSize));
this.defaultPriority = defaultPriority;
}
- 示例代码未完全实现。
public class PriorityThreadpoolImpl extends ThreadPoolExecutor {
public PriorityThreadpoolImpl(int poolSize, long defaultPriority) {
super(poolSize, poolSize, 0, TimeUnit.MILLISECONDS,
new PriorityBlockingQueue<Runnable>(poolSize));
this.defaultPriority = defaultPriority;
}
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new PriorityFutureTask<T>(runnable, value, getPriority(runnable));
}
//more code
}