Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有ExecutorService的GUI和多线程_Java_Multithreading_Guice_Executorservice - Fatal编程技术网

Java 带有ExecutorService的GUI和多线程

Java 带有ExecutorService的GUI和多线程,java,multithreading,guice,executorservice,Java,Multithreading,Guice,Executorservice,我正在试图找到一种方法,让执行器服务执行可调用的s。提交线程不应等待所有可调用的完成。这应该由一个单独的线程来完成。那些Callables有一个由Guice注入的FooServiceFooService正在处理会话。要防止超出范围的异常,我使用 ServletScopes.transferRequest(可调用可调用) 以下是一些示例代码: private void executeTasks() { ExecutorService es = Executors.newFixedThrea

我正在试图找到一种方法,让
执行器服务执行
可调用的
s。提交线程不应等待所有可调用的
完成。这应该由一个单独的线程来完成。那些
Callable
s有一个由Guice注入的
FooService
FooService
正在处理
会话
。要防止超出范围的异常,我使用
ServletScopes.transferRequest(可调用可调用)

以下是一些示例代码:

private void executeTasks() {
    ExecutorService es = Executors.newFixedThreadPool(4);
    List<Future<String>> futures = IntStream.of(32, 42, 52, 62)
            .mapToObj(i -> ServletScopes.transferRequest(taskFactory.create(i)))
            .map(task -> es.submit(task)).collect(Collectors.toList());
    es.shutdown();

    // Runnable resultHandlingTask = () -> {
        futures.parallelStream().forEach((Future<String> result) -> {
            try {
                LOGGER.debug("Result: " + result.get());
            } catch (InterruptedException | ExecutionException ex) {
                LOGGER.debug("Exception while executing: ", ex);
            }
        });
    // };

    // new Thread(resultHandlingTask).start();
    System.out.println("Done!");
}
这里是stacktrace:

DEBUG: Thread-20: 2015-11-18 17:17:52,514 [TestPage.java:276]  -  Exception while executing: 
java.util.concurrent.ExecutionException: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error in custom provider, java.lang.NullPointerException
  at nl.mycompany.app.services.FooService.class(FooService.java:13)
  while locating nl.mycompany.app.services.FooService

1 error
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at nl.mycompany.app.modules.amodule.pages.TestPage.lambda$null$6(TestPage.java:274)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at nl.mycompany.app.modules.amodule.pages.TestPage.lambda$test2$7(BerichtenVerwerkenPage.java:272)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error in custom provider, java.lang.NullPointerException
  at nl.mycompany.app.services.FooService.class(FooService.java:13)
  while locating nl.mycompany.app.services.FooService

1 error
    at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)
    at nl.mycompany.app.services.BarTask.call(BarTask.java:24)
    at nl.mycompany.app.services.BarTask.call(BarTask.java:12)
    at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
    at com.google.inject.servlet.ServletScopes$4.call(ServletScopes.java:274)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    ... 1 more
Caused by: java.lang.NullPointerException
    at com.google.inject.servlet.ServletScopes$2$1.get(ServletScopes.java:153)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)
    at com.google.inject.internal.InjectorImpl.__callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java)
    at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)
    ... 8 more

你能发布完整的stacktrace吗?@Thomas告诉我,似乎在某个地方出现了并发问题,因为没有一直引发异常。看来
FooService
提供程序的内置绑定是问题的一部分。因为当
FooService
作为单个实例注入时(没有提供程序stuf),没有例外。当
FooServiceProvider
实现
Provider
(并设置为
SessionScoped
)绑定时,也没有例外。(在上面的场景中,
FooService
的提供者实际上不是必要的,但在我的现实生活场景中是必要的。)你能将FooService@Singleton范围限定吗?我想这可以解决这个问题issue@Thomas诚然,让
FooService
成为一个单身汉可以解决这个问题。我使示例代码保持简单。在我正在处理的案例中,我有一个使用(会话范围)rest客户端的服务,该客户端使用用户设置(存储在db中)。然后服务还使用一个消息工厂,该工厂需要知道(当前会话的)当前用户。另一个解决方法是去掉“等待线程”,该线程在示例代码中被注释掉。
DEBUG: Thread-20: 2015-11-18 17:17:52,514 [TestPage.java:276]  -  Exception while executing: 
java.util.concurrent.ExecutionException: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error in custom provider, java.lang.NullPointerException
  at nl.mycompany.app.services.FooService.class(FooService.java:13)
  while locating nl.mycompany.app.services.FooService

1 error
    at java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.util.concurrent.FutureTask.get(FutureTask.java:192)
    at nl.mycompany.app.modules.amodule.pages.TestPage.lambda$null$6(TestPage.java:274)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at nl.mycompany.app.modules.amodule.pages.TestPage.lambda$test2$7(BerichtenVerwerkenPage.java:272)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) Error in custom provider, java.lang.NullPointerException
  at nl.mycompany.app.services.FooService.class(FooService.java:13)
  while locating nl.mycompany.app.services.FooService

1 error
    at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)
    at nl.mycompany.app.services.BarTask.call(BarTask.java:24)
    at nl.mycompany.app.services.BarTask.call(BarTask.java:12)
    at com.google.inject.servlet.GuiceFilter$Context.call(GuiceFilter.java:203)
    at com.google.inject.servlet.ServletScopes$4.call(ServletScopes.java:274)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    ... 1 more
Caused by: java.lang.NullPointerException
    at com.google.inject.servlet.ServletScopes$2$1.get(ServletScopes.java:153)
    at com.google.inject.internal.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
    at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)
    at com.google.inject.internal.InjectorImpl.__callInContext(InjectorImpl.java:1092)
    at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java)
    at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)
    ... 8 more