- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 ExecutorCompletionService 出现了奇怪的行为。该项目被添加到 ExecutorCompletionService.submit() 中。然后它会被处理并由之前提交的 Callable 工作线程返回。返回之后,ExecutorCompletionService.take() 永远不会看到它,因此永远不会看到返回更多项目的阻塞?我真的不知道发生了什么事。我已经创建了打印行,并且可以看到它完成了可调用工作线程。一旦发生这种情况,ExecutorCompletionService.take 就应该准备好接受,但在某些情况下,事情会锁定,有时又没问题?
我创建了一个测试用例,如果您运行它几次,您会发现它在某些情况下会锁定并且永远不会占用任何已完成的线程
线程死锁演示
import java.util.Observable;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
public class ThreadDeadlockDemo extends Observable implements Runnable {
private CompletionService<String> pool;
private ExecutorService executor ;
private Thread responseWorkerThread;
private HttpSchedulerWorker schedulerWorker;
private boolean shouldRun = true;
private int numThreadsInPool;
private BlockingQueue<String> queue;
public ThreadDeadlockDemo(int numThreads)
{
numThreadsInPool = numThreads;
executor = Executors.newFixedThreadPool(numThreads);
pool = new ExecutorCompletionService<String>(executor);
schedulerWorker = new HttpSchedulerWorker();
responseWorkerThread = new Thread(schedulerWorker);
responseWorkerThread.start();
queue = new LinkedBlockingQueue<String>();
new Thread(this).start();
}
public ThreadDeadlockDemo()
{
numThreadsInPool = 1;
executor = Executors.newFixedThreadPool(1);
pool = new ExecutorCompletionService<String>(executor);
schedulerWorker = new HttpSchedulerWorker();
responseWorkerThread = new Thread(schedulerWorker);
responseWorkerThread.start();
queue = new LinkedBlockingQueue<String>();
new Thread(this).start();
}
public void setThreadCount(int numThreads)
{
executor = Executors.newFixedThreadPool(numThreads);
pool = new ExecutorCompletionService<String>(executor);
numThreadsInPool = numThreads;
}
public void add(String info) {
queue.add(info);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(shouldRun)
{
try {
String info = queue.take();
Callable<String> worker = new WorkerThread(info);
System.out.println("submitting to pooler: " + info);
pool.submit(worker);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Inner class of proxy is a worker thread blocks until the pool has transactions complete as soon as they
* are complete it will send them to server for completion.
* @author Steve
*
*/
class HttpSchedulerWorker implements Runnable{
public void run() {
// TODO Auto-generated method stub
while(true)
{
String vulnInfo = null;
try {
Future<String> tmp = pool.take();
// Future<VulnInfo> tmp = pool.poll();
if(tmp != null)
vulnInfo = tmp.get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(vulnInfo != null)
{
System.out.println("info was taken from pool completed: " + vulnInfo);
}
}
}
}
}
WorkerClass:这是添加到执行程序池并返回的线程工作线程,但在某些情况下永远不会在 ThreadlockDemos ExecutorCompletionService 池中收到通知?
import java.util.concurrent.Callable;
public class WorkerThread implements Callable<String>{
String info;
WorkerThread(String info)
{
this.info = info;
}
//@Override
public String call() throws Exception {
System.out.println("sending vuln info: " + info);
return info;
}
}
这是我的测试类,只是将项目添加到队列中。这是我的控制台的打印输出,看起来似乎失败了。它添加到队列中并对其进行处理并返回值。但是 take() 从来没有被调用过,为什么呢?它有时有效,有时失败,这让我很难看出问题所在。我很想说它在 java 中的错误,但我环顾四周没有发现这些类有任何问题?
public class HttpSchedulerThreadedUnitTest {
ThreadDeadlockDemo scheduler;
public HttpSchedulerThreadedUnitTest(){
setupScheduler();
for(int i=0; i < 5;i++)
{
scheduler.add(i+"");
}
}
private void setupScheduler()
{
scheduler = new ThreadDeadlockDemo();
scheduler.setThreadCount(1);
}
public static void main(String[] args)
{
new HttpSchedulerThreadedUnitTest();
}
}
控制台打印:这是它在 WorkerThread 完成时从不从池中获取的运行情况提交到池化器:0提交到池化器:1提交到池化器:2发送漏洞信息:0提交到池化器:3发送漏洞信息:1提交到池化器:4发送漏洞信息:2发送漏洞信息:3发送漏洞信息:4
控制台打印:它实际上正在从池中获取项目返回!提交到池化器:0提交到池化器:1提交到池化器:2提交到池化器:3提交到池化器:4发送漏洞信息:0信息已从已完成的池中获取:0发送漏洞信息:1信息已从已完成的池中获取:1发送漏洞信息:2信息从已完成的池中获取:2发送漏洞信息:3信息从已完成的池中获取:3发送漏洞信息:4信息已从池中获取完成:4
最佳答案
这是很多代码。如果你能减少它(通过删除 http 相关部分等),那就太好了。我也不确定你的意思 After that return the ExecutorCompletionService.take 永远不会看到它,所以永远不会看到返回更多项目的阻塞?
您可以在锁定时进行线程转储,并查看哪个线程被锁定在代码的哪个点。
同时,我确实看到一些看起来错误的代码。
while(requestQueue.isEmpty()){
try {
synchronized(this)
{
wait();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在这里,您正在同步一个可运行的对象。这几乎总是错误的,因为可运行对象通常不会被多个线程访问。您还在测试同步语句之外的条件。通常您按如下方式使用等待:
synchronized(lock){
while(!condition){
wait();
}
}
但是,我没有看到任何在可运行对象上调用通知的代码。这可能会导致程序挂起。基本上你在等待某件事,但没有人叫醒你,所以你无限期地等待。这是否是您所面临问题的原因,可以通过在发生这种情况时查看线程转储来轻松确定。
如果您使用队列,最好的建议是使用阻塞队列作为请求队列。这样您就不必完全执行此等待/通知业务。
关于java - ExecutorCompletionService 未获取 Callable 返回的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6977617/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
在编码时,我问了自己这个问题: 这样更快吗: if(false) return true; else return false; 比这个? if(false) return true; return
如何在逻辑条件下进行“返回”? 在这样的情况下这会很有用 checkConfig() || return false; var iNeedThis=doSomething() || return fa
这是我的正则表达式 demo 如问题所述: 如果第一个数字是 1 则返回 1 但如果是 145 则返回 145 但如果是 133 则返回 133 样本数据a: K'8134567 K'81345678
在代码高尔夫问答部分查看谜题和答案时,我遇到了 this solution返回 1 的最长和最晦涩的方法 引用答案, int foo(void) { return! 0; } int bar(
我想在下面返回 JSON。 { "name": "jackie" } postman 给我错误。说明 Unexpected 'n' 这里是 Spring Boot 的新手。 1日龄。有没有正确的方法来
只要“is”返回 True,“==”不应该返回 True 吗? In [101]: np.NAN is np.nan is np.NaN Out[101]: True In [102]: np.NAN
我需要获取所有在 6 号或 7 号房间或根本不在任何房间的学生的详细信息。如果他们在其他房间,简单地说,我不希望有那个记录。 我的架构是: students(roll_no, name,class,.
我有一个表单,我将它发送到 php 以通过 ajax 插入到 mysql 数据库中。一切顺利,php 返回 "true" 值,但在 ajax 中它显示 false 消息。 在这里你可以查看php代码:
我在 Kotlin 中遇到了一个非常奇怪的无法解释的值比较问题,以下代码打印 假 data class Foo ( val a: Byte ) fun main() { val NUM
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
在调试窗口中,以下表达式均返回 1。 Application.WorksheetFunction.CountA(Cells(4 + (i - 1) * rows_per_record, 28) & "
我在本地使用 jsonplaceholder ( http://jsonplaceholder.typicode.com/)。我正在通过 extjs rest 代理测试我的 GET 和 POST 调用
这是 Postman 为成功调用我的页面而提供的(修改后的)代码段。 var client = new RestClient("http://sub.example.com/wp-json/wp/v2
这个问题在这里已经有了答案: What to do with mysqli problems? Errors like mysqli_fetch_array(): Argument #1 must
我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。 运行方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字) 但不知何故它不起作用
我已经编写了一个类来处理命名管道连接,如果我创建了一个实例,关闭它,然后尝试创建另一个实例,调用 CreateFile() 返回 INVALID_HANDLE_VALUE,并且 GetLastErro
即使 is_writable() 返回 true,我也无法写入文件。当然,该文件存在并且显然是可读的。这是代码: $file = "data"; echo file_get_contents($fil
下面代码中的变量 $response 为 NULL,尽管它应该是 SOAP 请求的值。 (潮汐列表)。当我调用 $client->__getLastResponse() 时,我从 SOAP 服务获得了
我一直在网上的不同论坛上搜索答案,但似乎没有与我的情况相符的... 我正在使用 Windows 7,VS2010。 我有一个使用定时器来调用任务栏刷新功能的应用程序。在该任务栏函数中包含对 LoadI
我是一名优秀的程序员,十分优秀!