我用a ExecutorService来执行任务.此任务可以递归地创建提交给它的其他任务,ExecutorService这些子任务也可以这样做.
我现在遇到的问题是,在我继续之前,我要等到所有任务完成(即所有任务都完成并且他们没有提交新任务).
我不能ExecutorService.shutdown()在主线程中调用,因为这可以防止新任务被接受ExecutorService.
ExecutorService.awaitTermination()如果shutdown没有被召唤,呼叫似乎什么都不做.
所以我有点卡在这里.ExecutorService要看到所有工人都闲着,这不是很难,是吗?我能想出的唯一不合理的解决方案是直接使用a ThreadPoolExecutor并getPoolSize()偶尔查询它.这样做真的没有更好的方法吗?
我正在尝试做一些相对简单的事情,我想。以 doSomething(int) 方法的以下 Java 字节码为例:
public java.lang.String doSomething(int i);
0 iload_1 [i]
1 invokestatic MyHelper.doSomething(int) : Java.lang.String
4 areturn
Run Code Online (Sandbox Code Playgroud)
这个字节码几乎只将调用转发给静态助手。
我现在想要做的是使用 Javassist 将 invokestatic 替换为 invokedynamic。我知道如何使用 ASM 做到这一点,因此只是出于纯粹的好奇心假设我想知道它是如何工作的。以下是我的一些问题:
1) 以下是否正确:我不能使用 javassist CtMethod.instrument() 或 CtMethod.insertAt() 方法,因为这些方法需要包含有效 Java 表达式的字符串,而我不能用 Java 语法编写调用动态?
2) invokestatic 的参数就像 invokevirtual 或 invokestatic 的参数一样处理,对吗?我的意思是,您在调用动态之前将参数放入堆栈,就像对 invokevirtual 所做的一样?
3)是否有使用Javassist创建invokedynamic字节码的示例代码(或者你能想出一些)吗?
这就是我目前所知道的:您可以创建一个具有 addInvokedynamic() 方法的 Bytecode 对象。但这需要 BootstrapMethodsAttribute 中 BootstrapMethod 的索引。BootstrapMethod 反过来需要常量池中方法句柄信息的索引,该索引需要方法引用等。所以基本上你必须自己管理整个常量池条目。没关系,但我担心我没有做对,以后会引入奇怪的问题。有没有更简单的方法来做到这一点(辅助方法左右)?我的代码大致看起来像这样(我并没有真正“重写”上面的 invokestatic 但是:
void transform(CtMethod ctmethod, String originalCallDescriptor) {
MethodInfo mInfo = ctmethod.getMethodInfo();
ConstPool pool = ctmethod.getDeclaringClass().getClassFile().getConstPool();
/* add info about the …Run Code Online (Sandbox Code Playgroud)