gpt4 book ai didi

java - CompletableFuture.thenAccept 中使用的垃圾回收对象的可用性

转载 作者:行者123 更新时间:2023-11-29 09:59:22 25 4
gpt4 key购买 nike

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

我想知道它是如何工作的?线程 (myThread) 在 3 秒后死亡并且 DummyObject 超出范围,thenAccept 中的异步回调仍在打印正确的值。线程是否锁定了 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

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());
System.out.println(dummyObj.getObjectNationality());
}
});
}
};

myThread.start();
try {
Thread.sleep(3 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
myThread.stop();
System.out.println("Thread Alive? "+ myThread.isAlive());

System.out.println("Reached Main end and waiting for 8 more seconds");

try {
Thread.sleep(8 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

class AsyncTaskExecuter {
public CompletableFuture<Boolean> executeAsync() {
return (CompletableFuture<Boolean>) CompletableFuture.supplyAsync(this::theTask);
}

public Boolean theTask() {
try {
Thread.sleep(6 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
}

class DummyObject {
private String objectName;
private String objectNationality;
// getters and setters
}

最佳答案

首先。请不要使用 stop() 方法。它已被弃用。线程在执行完其 run 方法后自行终止。

现在回答您的问题,当您创建 CompletableFuture 时,它​​还会在 java 的 ForkJoinCommonPool 中创建一个线程,并在将来的某个时间在那里执行它。如此有效地在您的应用程序中创建了 3 个线程。所以您的对象不会死,因为它将被其中一个线程使用。

  1. 主线程
  2. 我的话题
  3. 最后一个是由 CompletableFuture 创建的。 (这将使用虚拟对象)

所以即使线程1、2死掉了。线程 3 仍然会执行。

enter image description here

附言我已将您的线程命名为 Thread-MyThread 以向您展示这些线程。您可以通过调用线程的构造函数来为线程命名,该构造函数将线程的名称作为参数。我使用的工具是 JVisualVM。

关于java - CompletableFuture.thenAccept 中使用的垃圾回收对象的可用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43784492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com