- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚完成了我的网络作业队列,我有一个关于 Java 中 PriortiyQueue 性能的小问题。
获取此代码:
private void performJob() {
lock.lock();
try {
NetworkJob job = actions.poll();
if (job.perform()) {
return;
}
actions.add(job); //Job was a failure, add it back to the queue
} finally {
lock.unlock();
}
}
在作业失败的情况下,作业仍然需要在队列中。所以,我的问题是:poll()
然后add()
或peek()
然后remove()更好
我个人倾向于下面的代码,但考虑到作业不应该真正失败(在大多数情况下,假设它是通过的)是不是更好地使用poll()
?
private void performJob() {
lock.lock();
try {
NetworkJob job = actions.peek();
if (!job.perform()) {
return;
}
actions.remove(); //Job was a success, we can remove it from the queue.
} finally {
lock.unlock();
}
}
完全是吹毛求疵,由于队列很少使用,可能不值得担心,但它引起了我的兴趣,我想看看你的推理。
完整代码:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import java.util.PriorityQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public final class NetworkQueue implements Runnable {
private final Context context;
private final AtomicBoolean running = new AtomicBoolean(true);
private final PriorityQueue<NetworkJob> actions = new PriorityQueue<>(5, new NetworkJobComparator());
private final ReentrantLock lock = new ReentrantLock();
private final Condition jobReady = lock.newCondition();
private final Condition networkUp = lock.newCondition();
private ConnectionType connection = ConnectionType.NONE;
public NetworkQueue(Context context) {
this.context = context;
context.registerReceiver(new NetworkListener(),
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
public void run() {
try {
while (running.get()) {
waitJobAvailable();
waitNetworkUp();
performJob();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void setNetwork(ConnectionType net) {
lock.lock();
try {
connection = net;
if (connection != ConnectionType.NONE) {
networkUp.signal();
}
} finally {
lock.unlock();
}
}
private void waitNetworkUp() throws InterruptedException {
lock.lock();
try {
while (connection != ConnectionType.NONE) {
networkUp.await();
}
} finally {
lock.unlock();
}
}
private void waitJobAvailable() throws InterruptedException {
lock.lock();
try {
while (actions.isEmpty()) {
jobReady.await();
}
} finally {
lock.unlock();
}
}
private void performJob() {
lock.lock();
try {
NetworkJob job = actions.peek();
if (!job.perform()) {
return;
}
actions.remove();
} finally {
lock.unlock();
}
}
public boolean addJob(NetworkJob job) {
lock.lock();
try {
if (this.actions.contains(job)) {
return false;
}
this.actions.add(job);
this.jobReady.signal();
return true;
} finally {
lock.unlock();
}
}
public void end() {
this.running.set(false);
}
private class NetworkListener extends BroadcastReceiver {
ConnectivityManager conn = (ConnectivityManager)
context.getSystemService(Context.CONNECTIVITY_SERVICE);
@Override
public void onReceive(Context context, Intent intent) {
NetworkInfo networkInfo = conn.getActiveNetworkInfo();
if (networkInfo == null) {
setNetwork(ConnectionType.NONE);
return;
}
if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
setNetwork(ConnectionType.WIFI);
return;
}
setNetwork(ConnectionType.ANY);
}
}
}
最佳答案
在 OpenJDK 和 OracleJDK 中基于标准堆的 PriorityQueue
实现中,peek()
调用速度非常快:
public E peek() {
return (size == 0) ? null : (E) queue[0];
}
这是因为堆根始终是最小元素。相反,删除和添加操作可能非常昂贵,因为它们可能需要重组堆。因此peek/remove
解决方案可能会更快。
在我的库中,我有一个算法从未排序的输入中选择n
个最少元素。我使用 PriorityQueue
实现它,它最多保留到目前为止找到的 n
个最少元素。第一个实现就像add/poll
。当我 updated 使用 peek
时,性能得到了极大的提高(在某些测试中高达 10 倍)。
关于Java 优先级队列 : Is it better to poll() and then add() or peek() and then remove(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32904405/
我原以为 epoll 应该比 poll 快,但是当我做下面的实验时,结果发现它更慢。 首先,我设置了 1 个连接了 10 个客户端套接字的服务器套接字。 import socket server =
当我尝试在代码编辑器中粘贴时他剪掉了我的标签。它不允许它..我不明白,我什么都试过了。 有人可以帮助我.. 给我> extended_valid_elements: 'poll[poll-id
我无法唤醒被 poll.poll() 函数阻塞的线程。有人可以帮我吗? 最佳答案 处理这个问题的方法是在传递给 poll() 的描述符列表中包含一个额外的文件描述符。对于该描述符,等待读取准备就绪。让
在下面的 poll() 方法中,我的 IDE 提示它返回 JobSet。工具提示显示: my.package.JobSetQueue 中的 poll() 与 java.util.concurrent.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
在每个 youtube 教程中,我都看到人们只是将“app_name”添加到 INSTALLED_APPS 列表中。 昨天我开始了官方 Django 教程,他们建议使用“app_name.apps.A
我正在查看 LinkedList 中的 poll() 和 unlinkFirst() 代码,但我似乎找不到如何实现如果 LinkedList 中存在 null 项,它可以防止返回 null。 poll
为什么当我尝试轮询时,我在 ajax 中看到此错误消息“(!)注意: undefined index :在 D:\wamp\www\poll\poll.php 第 6 行中进行轮询”。我有两个文件 1
我使用 python 的 cProfile 模块分析了我的 python 代码并得到了以下结果: ncalls tottime percall cumtime percall filen
我尝试通过 websocket 和轮询运行我的 socket.io 程序,它们都有效。但是,当尝试运行 xhr-polling 时,它会超时。这可能是什么原因造成的? 对于这个程序,我使用的是 soc
我正在实现自己的自定义组件,我发现我需要为消费者提供两个用例: 第一个尝试经常获取 N 条可用消息(轮询消费者) 第二个是订阅者消费者,它会在消息可用时获取消息。 我的主要问题是是否可以实现这两种类型
测试环境:Ubuntu 12.04描述:我做了以下 # `sudo truncate -s 0 /var/log/syslog` # logger "helloworld". # `cat /var/
我正在使用(很棒的)mrjob Yelp 的库在 Amazon 的 Elastic Map Reduce 中运行我的 python 程序。它依赖于标准 python 库中的子进程。在我运行 pytho
这直接来自民意调查教程,我是编程新手,正在学习 Python 和 Django,这对我来说看起来很陌生。这是 JavaScript 吗?我还需要学习什么语言才能学习 Django 吗? 民意调查/模板
我试图了解在 kafka 消费者中处理需要更长时间处理的记录的更好选择是什么?我进行了一些测试来理解这一点,并观察到我们可以通过修改 max.poll.records 来控制这一点。或 max.pol
我正在尝试创建我的 Django 项目/网站的“投票”部分,教程 (https://docs.djangoproject.com/en/1.8/intro/tutorial01/) 说在我们“激活”模
我有一个应用程序,其工作原理如下:Linux 机器生成 28 种不同类型的给客户的信件。信件必须以 .docx(Microsoft Word 格式)发送。秘书维护 MS Word 模板,必要时会自动使
我目前正在尝试让 FileSystemWatcher 工作,如 this question 中所述.在我的研究过程中,我在这个网站上发现了很多描述这个类(class)不可靠的答案和评论。相反,在某些地
我正在寻找 kafka 来实现低延迟消息队列,并且我一直在阅读有关消费者长轮询的信息。但是,没有关于如何实际使用长轮询或需要设置哪些选项才能启用它的示例。如何使用 kafka java api 启用长
用户首次登录时的通知,没那么难,只需要扫描数据库,我可以处理。然而,当 friend 在个人资料 X 上发送请求或评论时,会发送通知,并且几乎立即在另一端收到通知,即使用户 X 没有提出任何请求。是投
我是一名优秀的程序员,十分优秀!