Java Jexl并行处理示例
我需要在Jexl中同时执行多个操作。在官方指南中,我找到了注解@parallel: 但是我没有找到任何使用它的例子 有人能举一些例子吗 我想它会像这样工作:Java Jexl并行处理示例,java,jexl,Java,Jexl,我需要在Jexl中同时执行多个操作。在官方指南中,我找到了注解@parallel: 但是我没有找到任何使用它的例子 有人能举一些例子吗 我想它会像这样工作: @parallel { a.someMethod() } @parallel { b.someMethod() } 但它似乎仍在按顺序工作。 我尝试过的第二个示例仍然不起作用: var loopFunction = function(title){ var i = 0; logger:info("Starting "+ti
@parallel { a.someMethod() }
@parallel { b.someMethod() }
但它似乎仍在按顺序工作。
我尝试过的第二个示例仍然不起作用:
var loopFunction = function(title){
var i = 0;
logger:info("Starting "+title);
while(i<100) {
logger:info(title+"="+i);
utils:sleep(25);
i += 1;
}
logger:info("Ending "+title);
}
@parallel loopFunction('i');
@parallel loopFunction('j');
var loopFunction=函数(标题){
var i=0;
记录器:信息(“开始”+标题);
虽然(i它似乎是注释的一个示例,但在中,似乎只实现了同步的
当你说“它仍在按顺序工作”时,这意味着什么?你是如何检查的?我试图通过日志记录向这个方法添加大循环(5秒)。我在a.somethod()
log之后得到了b.somethod()
log。也许可以尝试在utils.sleep
中使用随机时间(这样我和j就有了不同的等待时间)。如果它不能解决问题,我将让jexl专业人士帮助您:p尝试不同的计时,不同的循环长度。它仍然打印开始I I=1…I=100结束I开始j=1…j=250结束j
@Override
public Object processAnnotation(String name, Object[] args,Callable<Object> statement) throws Exception {
if ("synchronized".equals(name)) {
final Object arg = args[0];
synchronized(arg) {
return statement.call();
}
}
throw new IllegalArgumentException("unknown annotation " + name);
}
/**
* Run same test function in NTHREADS in parallel.
* @param ctask the task / test
* @param loops number of loops to perform
* @param cache whether jexl cache is used or not
* @throws Exception if anything goes wrong
*/
@SuppressWarnings("boxing")
void runThreaded(Class<? extends Task> ctask, int loops, boolean cache) throws Exception {
if (loops == 0) {
loops = MIX.length;
}
if (!cache) {
jexl = jexlNoCache;
} else {
jexl = jexlCache;
}
java.util.concurrent.ExecutorService execs = java.util.concurrent.Executors.newFixedThreadPool(NTHREADS);
List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>(NTHREADS);
for (int t = 0; t < NTHREADS; ++t) {
tasks.add(jexl.newInstance(ctask, loops));
}
// let's not wait for more than a minute
List<Future<Integer>> futures = execs.invokeAll(tasks, 60, TimeUnit.SECONDS);
// check that all returned loops
for (Future<Integer> future : futures) {
Assert.assertEquals(Integer.valueOf(loops), future.get());
}
}