- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个管理器类,多个线程将自己注册到该类(使用 UUID
为每个请求生成唯一标识符),提供要处理的有效负载并从管理器获得相应的响应。我正在使用 java.util.concurrent.ExecutorService
启动多个线程。这是用于测试我的管理器功能的实现 -
public class ManagerTest {
public static void main(String[] args) {
try {
Manager myManager = new Manager();
// Start listening to the messages from different threads
myManager.consumeMessages();
int num_threads = Integer.parseInt(args[0]);
ExecutorService executor = Executors.newFixedThreadPool(num_threads);
for (int i = 0; i < num_threads; i++) {
// class implementation is given below
Runnable worker = new MyRunnable(myManager);
executor.execute(worker);
}
executor.shutdown();
// Wait until all threads are finish
while (!executor.isTerminated()) {
}
System.out.println("\nFinished all threads");
myManager.closeConnection();
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
}
}
下面是MyRunnable
类的实现
class MyRunnable implements Runnable {
private Manager managerObj;
public MyRunnable(Manager managerObj) {
this.managerObj = managerObj;
}
@Override
public void run() {
try {
Random rand = new Random();
int n = rand.nextInt(35);
String requestId = UUID.randomUUID().toString();
managerObj.registerRequest(requestId, n);
managerObj.publishMessage(requestId);
// Want to avoid this while loop
while( ! managerObj.getRequestStatus(requestId)){
}
int response = managerObj.getRequestResponse(requestId);
// do something else
managerObj.unregisterRequest(requestId);
} catch (IOException e) {
e.printStackTrace();
}
}
}
管理器将处理请求,并且根据负载的不同,请求的响应可能需要不同的时间。每当管理器获得响应时,它都会通过调用此函数 setRequestStatus(requestId)
将请求状态设置为 true。在此之后,线程将从 while 循环
中退出并继续执行。
如果代码工作正常,但线程正在做太多工作,然后需要不断循环 while 循环直到满足条件。
他们是在向管理器发送请求后让线程 hibernate 的一种方法,并且管理器向该线程发出信号以在其响应准备就绪时唤醒。
如果这对某些人来说太简单了,请原谅我,我是 Java 和 Java 线程接口(interface)的新手。
最佳答案
没关系,我们习惯了简单的问题,而你的问题其实写得很好并且有一个合理的问题要解决,我们每天都看到很多更糟糕的问题,比如人们不知道他们想要什么,如何提出要求等
所以,你正在做的是一个繁忙的自旋循环,这是一件非常糟糕的事情,因为 a) 它每个线程消耗了一个完整的 CPU 内核,并且 b) 它实际上让 CPU 保持忙碌,这意味着它正在从可能有有用工作要做的其他线程窃取处理时间。
有很多方法可以解决这个问题,我会从最差到最好列出它们。
改进代码的最简单方法是调用 java.lang.Thread.sleep(long millis)
方法,将 0
作为参数传递给它.这也被称为“yield”操作,它本质上意味着“如果有任何其他线程有一些有用的工作要做,让它们运行,并在它们完成后返回给我”。这只比 busy-spin-looping 稍微好一点,因为它仍然会消耗 100% 的 CPU。好处是它只会消耗 CPU 而其他线程无事可做,所以至少不会减慢其他事情。
下一个最好但仍然不是很聪明的改进代码的方法是调用 java.lang.Thread.sleep(long millis)
方法传递它 1
作为参数。这被称为“传递”操作,它本质上意味着“将我的时间片的剩余部分释放给可能有一些有用工作要做的任何其他线程”。换句话说,剩余的时间片被没收,即使整个系统不需要做任何有用的工作。这将使 CPU 消耗降低到几乎为零。缺点是 a) CPU 消耗实际上会略高于零,b) 机器将无法进入某种低功耗 sleep 模式,c) 您的工作线程的响应速度会稍慢:它会恢复仅在时间片边界上工作。
解决问题的最佳方法是使用 java 内置的同步 机制,如以下答案所述:https://stackoverflow.com/a/5999146/773113这不仅会消耗零 CPU,甚至可以让机器在等待时进入低功耗模式。
要解决最一般情况下的问题,您不希望只等到某个条件,而是实际上还传递有关已完成的工作或将要完成的工作的信息,您将使用 BlockingQueue
。 ( https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/BlockingQueue.html ) 阻塞队列使用 java 内置同步机制工作并且允许一个线程将信息传递给另一个线程。
关于Java 执行器服务 :- Notify a thread to wake up when an event occurs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43271626/
谁能用一个例子来解释 BooleanQuery 中 lucene 中的 BooleanClause.Occur.Must 和 BooleanClause.Occur.SHOULD 之间的区别? 最佳答
正如标题所说,multiset 在所有相同值的范围末尾插入一个值。 (例如:在多重集 1,2,2,3 中插入 2 使其成为 1,2,2,/*new*/2,3)。 如何在所有相同值范围的开头插入新值?
所以这是与此(Inserting in a multiset: before the first occurence of that value instead of after the last o
我试图从我的 WCF .Net Framework 4.5 向 API rest 发布一个文件。这是我的代码: public string CreateConclusion(string[] inst
我的 SQL 查询获取固件的错误修复验证列表,例如def-456 是一张票,要求我对产品进行固件测试。 def-456 有几个记录结果的子任务。结果记录为:id:abc-123、abc-124、abc
我想删除文件中多次出现的行,但想保留某些行。我该怎么做? 这是我的文件的一部分,我想更改它: §M: 1, K: 2 name, time, cycle, instr, L1-mi
我正在 SSMS 中测试 SQL 2016 Live Query Stats,每次尝试时都会收到错误消息“执行批处理时出错。错误消息是:发生一个或多个错误。”并且不返回任何结果集。一位同事试过了,对他
我们在 JBoss 4.2 上设置了一个水平集群。在我们将缓存模式从 REPL_ASYNC 更改为 REPL_SYNC 以解决问题之前, session 复制工作正常。我们开始看到一些 session
我正在尝试将 MVC 网站发布为 Azure 网络角色。 当我在本地运行它时,一切正常。 但是当我将其发布到 Azure 并浏览某些 MVC 操作时,我收到此错误: Server Error in '
假设一个静态库 libfoo 依赖于另一个静态库 libbar 的某些功能。这些和我的应用程序都是用 D 编写的。如果我的应用程序只直接使用 libfoo,并且只调用 libfoo 中的函数而不引用
我正在尝试在 Eclipse Helios 上安装 SVN 客户端, 我已经从 Collaboration 节点安装了所有 SVN 模块(更新中), 现在重启后我可以选择一个连接器 出现“颠覆性连接器
我在 cakephp 中有一些代码会产生错误。 这是 PHP Controller : $this->loadModel( 'Vote' ); //Newly added by amit start
我需要有关 Java 代码的帮助。 这就是问题所在: 输入示例:AaaaaAa 输出:A 出现 7。 问题是我需要它来忽略案例。 请帮助我,我的代码工作正常,只是它不忽略大小写。 import jav
我正在为 J2ME 开发一个应用程序,有时它完全卡住并且 AMS 需要相当长的时间来关闭它.在我看来,这像是一个死锁问题。 你能告诉我什么会导致死锁吗?例如,如果对象调用其自身的另一个同步方法,调用对
尝试将 DEXguard 安装到 Eclipse 中的简单应用程序时出现以下错误: Errors occurred during the build. Errors running builder '
在 SAS 中,假设我有一个名为“person_groups”的数据集。它有两个变量,名为“person”和“group”。该数据集只是将每个人分配到一个组。 我如何从这个数据集中删除所有在他们的组中
有人知道如何在表达式中找到第 n 次出现的字符串以及如何用正则表达式替换它吗? 例如我有以下字符串 txt sub("(^(.*?-){4}.*?)-(.*?-.*?)-", "\\1|\\3||"
是否有一个包允许我为同一个缓冲区设置多个 Occur 结果缓冲区(例如 grep-a-lot: http://www.emacswiki.org/emacs/grep-a-lot.el )。 我在分析
我一直在寻找这个,但似乎无法找到它。 我有一个带有 try {} catch {} 语句的脚本。如果没有发生错误,我想添加一个操作。 例如 try { something } catch { "Err
我正在从 iPhone 应用程序将照片上传到 Facebook。我已经让它工作了,只是有时它会返回“发生未知错误”。我不确定问题是什么。这种情况发生的概率约为 75%。 其他人也遇到过这种情况吗? 最
我是一名优秀的程序员,十分优秀!