标签: completable-future

Java 更新到 17 版本后出现 CompletableFuture 的 java.lang.reflect.GenericSignatureFormatError

我已将我们公司应用程序的 Java 版本从 8 更新到 17。在本地计算机上,它在构建和运行时调用方面都运行良好。同样在 GitHub 上,它与 Junit 测试执行一起部署得很好。

问题是在我在 Heroku 上部署应用程序之后出现的。Heroku 构建成功,但在运行时,当我调用方法时,收到此错误:

"message": "Handler dispatch failed; nested exception is java.lang.reflect.GenericSignatureFormatError: Signature Parse error: expected a class type\n\tRemaining input: java/util/concurrent/CompletableFuture",
Run Code Online (Sandbox Code Playgroud)

它与java反射方法和方法的签名有关。我的控制器剩余方法返回一个 CompletableFuture 对象。CompletableFuture 有点不太好.........

java reflection heroku completable-future java-17

2
推荐指数
1
解决办法
2469
查看次数

使用ExecutorService的Java应用程序永远不会关闭

我正在尝试编写一个程序,将几个java工作线程之间的工作分开.问题是,当我从命令行运行它时,它永远不会返回.我没有得到我的提示,最终必须按ctrl-c关闭程序.

我把它简化为以下简单的案例

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestExeServ {

    private class ExpensiveTask implements Callable<Integer>{
        private final String msg; 
        public ExpensiveTask(String str){
            this.msg = str;
        }

        @Override
        public Integer call()  {
            System.out.println( "My message was " + msg);
            return 1;
        }
    }

    private void run()
    {
        final ExecutorService exeServ = Executors.newFixedThreadPool(2);
        Future<Integer> result = exeServ.submit(new ExpensiveTask("Hello!") );
        try {
            System.out.println( " Task is done, it returned " + result.get());
        } catch (Exception e) {
            e.printStackTrace();
        } …
Run Code Online (Sandbox Code Playgroud)

java multithreading executorservice completable-future

1
推荐指数
1
解决办法
217
查看次数

通过同步方法调用创建CompletableFuture

我想知道是否存在一种从同步方法调用创建CompletableFuture的情况。如果没有,为什么?

长版:

final CompletableFuture<ReturnType> future = new CompletableFuture<>();
final String parameters = "hello";
ReturnType result;
try {
    result = syncMethodCall(parameters);
} catch (Exception e) {
    future.completeExceptionally(e);
}
future.complete(result);
return future;
Run Code Online (Sandbox Code Playgroud)

所需的简短版本(或同类):

final String parameters = "hello";
return CompletableFuture.superMethod(() -> {syncMethodCall(parameters)});
Run Code Online (Sandbox Code Playgroud)

java lambda asynchronous java-8 completable-future

1
推荐指数
2
解决办法
6999
查看次数

CompletableFuture.thenAccept中使用的垃圾收集对象的可用性

我试图从使用的方法执行异步调用CompletableFuture.完成该任务后,我试图打印对象DummyObject的值,这些对象是调用异步调用的方法的本地对象.

我想知道它是如何工作的?thread(myThread)在3秒后死亡,DummyObject超出范围,thenAccept中的Async回调仍然打印正确的值.线程是否在DummyObject上获得锁定?或者其他事情正在发生?

请注意,我只是想模拟一个场景.所以我正在使用Thread.stop().

编辑 - 问题是关于thenAccept Consumer如何处理范围?请保持与此相关的答案.

以下计划的输出:

Starting Async stuff
Thread Alive?  false
Reached Main end and waiting for 8 more seconds
James T. Kirk
United Federation of Planets
Run Code Online (Sandbox Code Playgroud)

AsyncTest.java

public class AsyncTest {

    public static void main(String args[]) {

        Thread myThread = new Thread() {
            @Override
            public void run() {
                DummyObject dummyObj = new DummyObject();
                dummyObj.setObjectName("James T. Kirk");
                dummyObj.setObjectNationality("United Federation of Planets");
                System.out.println("Starting Async stuff");
                new AsyncTaskExecuter().executeAsync().thenAccept(taskStatus -> {
                    if(taskStatus.booleanValue()) {
                        System.out.println(dummyObj.getObjectName()); …
Run Code Online (Sandbox Code Playgroud)

java concurrency asynchronous java-8 completable-future

1
推荐指数
1
解决办法
467
查看次数

CompletionStage.thenCompose不按顺序执行

我正在尝试使用java 8 CompletionStages来串行执行2个异步方法,以便在第一个失败时不执行第二个异步方法.但是当我调用thenCompose时,传入的函数似乎在前一个函数完成之前开始(例如:两个函数错误地并行执行.这是代码:

  public CompletionStage<Graph> create(Payload payload) {
    CompletionStage<BlobInfo> fileFuture = createFile(payload);
    CompletionStage<Entity> metadataFuture = createMetadata(payload);
    return fileFuture
        .thenCompose(ignore -> metadataFuture)
        .thenApply(entity ->
            buildFromEntity(objectMapper, entity));
  }

  public CompletionStage<BlobInfo> createFile(Payload payload) {
    return CompletableFuture.supplyAsync(() -> {
      try {
        return
            storage.create(
                BlobInfo
                    .newBuilder(payload.bucket, payload.name)
                    .build(),
                payload.data.getBytes());
      } catch (StorageException e) {
        LOG.error("Failed to write to storage: " + e);
        throw new RequestHandlerException(StatusCode.SERVER_ERROR,
            "Failed to write to storage.");
      }
    });
  }


  public CompletionStage<Entity> createMetadata(Payload payload) {
    return CompletableFuture.supplyAsync(() -> createSync(payload));
  }

  private Entity …
Run Code Online (Sandbox Code Playgroud)

java java-8 completable-future

1
推荐指数
1
解决办法
378
查看次数

在kotlin中是否有Future.sequence类似物?

在scala中,你可以将未来的集合"映射"到集合的未来:

val l: List[Future[String]]  = List(Future {"1"}, Future {"2"})
val x: Future[List[String]] = Future.sequence(l)
Run Code Online (Sandbox Code Playgroud)

如何用kotlin同样的事情?

scala future kotlin completable-future

1
推荐指数
1
解决办法
141
查看次数

如何在循环中调用可完成的未来并结合所有结果?

我正在努力实现这样的目标.这是一个表达意图的组成示例.

我想要所有可完成的期货执行并将所有结果合并到一个结果并返回.因此,对于下面的示例,集合allResults应该具有字符串"one","two","three",每个3次.我希望他们都能并行而不是连续运行.

任何指向我可用于实现此目的的可完成未来的API的指针都将非常有用.

public class Main {


    public static void main(String[] args) {

        int x = 3;
        List<String> allResuts;

        for (int i = 0; i < x; i++) {

           //call getCompletableFutureResult() and combine all the results
        }

    }

    public static CompletableFuture<List<String>> getCompletableFutureResult() {

        return CompletableFuture.supplyAsync(() -> getResult());
    }

    private static List<String> getResult() {


        List<String> list = new ArrayList<>();
        list.add("one");
        list.add("two");
        list.add("three");

        return list;
    }


}
Run Code Online (Sandbox Code Playgroud)

java completable-future

1
推荐指数
1
解决办法
3913
查看次数

Java 8并行运行多个方法

我有2种方法,这些方法具有要同时运行的不同返回类型。这是我的代码:

public void method(int id) {
    final CompletableFuture<List<FooA>> fooACF = CompletableFuture.supplyAsync(() -> generateFooA(id));
    final CompletableFuture<List<FooB>> fooBCF = CompletableFuture.supplyAsync(() -> generateFooB(id));
    List<FooA> fooAs = fooACF.get();
    List<FooB> fooBs = fooBCF.get();
    //Do more processesing
}

public List<FooA> generateFooA(int id) {
    //code
}

public List<FooB> generateFooB(int id) {
    //code
}
Run Code Online (Sandbox Code Playgroud)

但是我不知道这两种方法是否都可以与上面的代码并行运行,或者我是否更好地说:

List<FooA> fooAs = generateFooA(id);
List<FooB> fooBs = generateFooB(id);
Run Code Online (Sandbox Code Playgroud)

如何正确使用可完成的期货才能并行运行这两种方法?

java concurrency java.util.concurrent java-8 completable-future

1
推荐指数
1
解决办法
6188
查看次数

Scala期货:如何保证非空结果?

假设我有一个返回的方法CompleteableFuture[Data]:

def doIt(): CompleteableFuture[Data] = { ... }
Run Code Online (Sandbox Code Playgroud)

而且,有一个非零的机会doIt()可以回归null.我们如何调用,doIt()直到结果不是null没有阻塞调用线程?Scala的方法是什么?

我目前的尝试:

Future {
  var data: Data = null
  blocking {
    while (data == null) { data = doIt().get }
  }
  data
} 
Run Code Online (Sandbox Code Playgroud)

我宁愿不使用blockingget.有任何想法吗?

此外,map在事实发生后,有人呼吁这个未来:

val myFuture = Future {
  var data: Data = null
  blocking {
    while (data == null) { data = doIt().get }
  }
  data
}.map { d => d.someMember } 
Run Code Online (Sandbox Code Playgroud)

d.someMemberNullPointerException …

java concurrency asynchronous scala completable-future

1
推荐指数
1
解决办法
119
查看次数

UUID.randomUUID()的CompletableFuture问题

所以我决定开始使用 CompletableFutureJava8,我无法弄清楚这个片段有什么问题:

public static void main(String...strings) throws Exception {
    final Supplier<User> makeUserSupplier = () -> makeUser();
    final Supplier<String> uuidSupplier =  () -> makeUUID();

    final CompletableFuture<User> futureUser = CompletableFuture.supplyAsync(makeUserSupplier);
    final CompletableFuture<String> futureUUID = CompletableFuture.supplyAsync(uuidSupplier);

    CompletableFuture.allOf(futureUser, futureUUID)
        .thenApplyAsync(aVoid -> {
            final User user = futureUser.join();
            final String uuid = futureUUID.join();
            return "received user + " + user + " and uuid is " + uuid ;
        })
        .handle((ok, e) -> {
            System.out.println("ok----" + ok);
            System.out.println("e----" + e);
            return null;
        });
} …
Run Code Online (Sandbox Code Playgroud)

uuid asynchronous java-8 completable-future

1
推荐指数
1
解决办法
65
查看次数