当前位置: 首页 > 面试题库 >

如何创建LIFO执行器?

乐正乐湛
2023-03-14
问题内容

我想创建一个线程池,它将执行最新提交的任务。关于如何做到这一点的任何建议?

谢谢


问题答案:

您可能只需要实现自己的BlockingQueue包装,即可将要约/投票映射到堆栈。然后将此作为BlockingQueue您传递给的实现ThreadPoolExecutor。我的建议是包装一个现有的Deque实现,例如ArrayDeque

  • 这是不同步的,因此您需要BlockingQueue使用同步器包装每个方法(如果不是更奇特的东西)。
  • 您还需要为阻止操作引入wait/ notify条件。
  • 最后,您需要将一组BlockingQueue极性(“放”侧或“取”侧)映射到出队的另一端(将其视为堆栈)。

请注意,在更快的并发堆栈上有一些工作(请参阅Herlihy的书, 《多处理器编程的艺术》
),但是我不认为JDK中有任何实现,而且我不确定Herlihy的实现是否提供了阻塞特性。

双端队列之上的实现

我查看了Android文档,这表明Deque在您身边,因此这里是一个实现。同样,在堆栈周围进行包装也很容易,但是Deque是首选。

import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.TimeUnit;


public final class BlockingLifoQueue<T> implements BlockingQueue<T>
{
  // we add and remove only from the end of the queue
  private final BlockingDeque<T> deque;

  public BlockingLifoQueue()
  { deque = new LinkedBlockingDeque<T>(); }

  public boolean add(T e) {
    deque.addLast(e);
    return true;
  }

  public boolean contains(Object o)
  { return deque.contains(o); }

  public int drainTo(Collection<? super T> c)
  { return deque.drainTo(c); }

  public int drainTo(Collection<? super T> c, int maxElements)
  { return deque.drainTo(c,maxElements); }

  public boolean offer(T e)
  { return deque.offerLast(e); }

  public boolean offer(T e, long timeout, TimeUnit unit)
      throws InterruptedException
  { return deque.offerLast(e,timeout,unit); }

  public T poll(long timeout, TimeUnit unit) throws InterruptedException
  { return deque.pollLast(timeout, unit); }

  public void put(T e) throws InterruptedException
  { deque.putLast(e); }

  public int remainingCapacity()
  { return deque.size(); }

  public boolean remove(Object o)
  { return deque.remove(o); }

  public T take() throws InterruptedException
  { return deque.takeLast(); }

  public T element()
  {
    if (deque.isEmpty()) { 
      throw new NoSuchElementException("empty stack");
    }

    return deque.pollLast();
  }

  public T peek()
  { return deque.peekLast(); }

  public T poll()
  { return deque.pollLast(); } // deque.peekLast(); } -- fixed typo.

  public T remove()
  {
    if (deque.isEmpty()) { 
      throw new NoSuchElementException("empty stack");
    }

    return deque.pollLast();
  }

  public boolean addAll(Collection<? extends T> c)
  { 
    for (T e : c) { deque.add(e); }
    return true;
  }

  public void clear()
  { deque.clear();}

  public boolean containsAll(Collection<?> c)
  { return deque.containsAll(c); }

  public boolean isEmpty()
  {  return deque.isEmpty(); }

  public Iterator<T> iterator()
  { return deque.descendingIterator(); }

  public boolean removeAll(Collection<?> c)
  { return deque.removeAll(c); }

  public boolean retainAll(Collection<?> c)
  { return deque.retainAll(c); }

  public int size()
  { return deque.size(); }

  public Object[] toArray()
  { return deque.toArray(); }

  public <T> T[] toArray(T[] a)
  { return deque.toArray(a); }
}


 类似资料:
  • 问题内容: 我已经在JCreator中编写了Java程序,一切都已完成,但是我想从中创建一个可执行文件,即,我不想通过加载Java类并编译然后执行来运行程序,而是将其作为独立的可执行文件。 最快的方法是什么? 问题答案: 你可以使用SDK附带的jar工具,并创建该程序的可执行版本。 这就是完成的方式。 我将从命令提示符中发布结果,因为它更容易,但是使用JCreator时也应如此。 首先创建你的程序

  • 如何用Gradle创建可执行JAR? 我尝试了,但它不起作用。

  • 我在Eclipse中完成了我的项目。我有,,和

  • 我不熟悉bat文件,并开始实现它。我有一个启动我的应用程序的linux应用程序命令列表。我有一个要部署的windows系统,用于git bash来执行这些命令,但在每次系统重启时都必须手动启动应用程序,所以我开始实现在系统启动时映射的bat文件 使用上面的脚本,我打开了git bash。还需要执行以下命令 必须使用git bash执行上述命令,因为它是开源命令,不在windows中执行。git b

  • 我是一名学生,开始学习线性回归。我们得到了一个手动回归公式:(X.T*X)**-1*X.T*y还有一个简单数组的例子: 现在我想用Boston数据集对多个变量做同样的处理。我需要创建一个类,该类的功能与LinearRegression()相同。一定有。fit()方法和。预测方法。当数组有超过1列时,如何操作没有任何解释。。。所以我很困惑。 以下是我最初所做的: 但它只返回1个系数,我不确定它是否正

  • 最近,我写了一个Spring-Boot项目,我希望Maven能够创建一个jar文件,我可以通过命令“java-jar”运行该文件。 这是我编写的pom.xml: 您能否考虑一种配置pom.xml文件的方法,使我能够使用“native”命令“mvn clean package”而不是繁琐的“mvn clean package spring-boot:repackage”获得jar文件? 谢谢