您好Groovy和Java专家
我们遇到了一种奇怪的Groovy行为,在我们看来,它就像是语言的局限性(或错误)。我们的长篇文章归结为以下问题:
当方法重载在起作用时,Groovy中的方法选择是否有意选择接口而不是子类?
我们创建了一个简单的示例来说明这种情况:
interface A {}
interface B {}
class C implements A, B {}
class D extends C {}
class Foo {
void add(A a) { System.out.println("A"); }
void add(B b) { System.out.println("B"); }
void add(C c) { System.out.println("C"); }
}
D d = new D();
new Foo().add(d);
Run Code Online (Sandbox Code Playgroud)
我们本来希望该方法Foo#add(C c) 被调用,但是会引发以下异常:
groovy.lang.GroovyRuntimeException: Ambiguous method overloading for method Foo#add.
Cannot resolve which method to invoke for [class D] due to overlapping prototypes between: [interface A] {interface B]
Run Code Online (Sandbox Code Playgroud)
这似乎是意外的, …
我一直在研究这个问题好几个小时,我无法得到一个像样的解决方案或解释为什么这个异常(java.net.SocketException:Socket关闭)被抛出.我的最后一个方法是现在问你们.
我已经为测试目的创建了一个简单的服务器 - 客户端应用程序("真正的"应用程序使用相同的逻辑),见下文.
如果我重复调用相同的测试用例(例如通过TestNG的invocationcount注释参数或使用简单的for循环),在某些时候会有一个java.net.SocketException:Socket关闭.
下面的测试用例基本上只是启动服务器(打开服务器套接字),等待几毫秒然后再次关闭套接字.关闭服务器套接字涉及打开套接字,以便服务器从ServerSocket.accept()方法返回(请参阅Server#shutdown()).
我虽然可能是在ServerSocket.accept() - 行之后的代码的多线程问题.所以我用一个synchronized块暂时包围它 - 也没有帮助.
你知道为什么会抛出这个异常吗?
最好,克里斯
Server.java看起来像这样:
package multithreading;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import org.apache.log4j.Logger;
public class Server {
private ServerSocket serverSocket;
private boolean isShuttingDown;
private final static Logger logger = Logger.getLogger(Server.class);
public void start() throws Exception {
try {
serverSocket = new ServerSocket(5000);
isShuttingDown = false;
} catch (Exception e) {
throw new RuntimeException("Starting up the server failed - aborting", e);
}
while (true) { …Run Code Online (Sandbox Code Playgroud) 一段时间以来,我的代码中一直存在错误,无法弄清楚如何解决它.
我想要实现的是很容易的:每个工作节点(即具有等级!= 0的节点)在涉及一些计算的方形结构中获得一行(由1维arry表示).计算完成后,该行将被发送回主服务器.
出于测试目的,不涉及计算.所有发生的事情是:
现在,我的问题是:
基于最后一个要点,我假设必须存在一些竞争条件,这些竞争条件仅在要发送回主设备的阵列达到一定大小时才会出现.
你知道问题是什么吗?
使用以下代码编译以下代码:mpicc -O2 -std = c99 -o simple
像这样运行可执行文件:mpirun -np 3 simple <size>(例如1006或1007)
这是代码:
#include "mpi.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MASTER_RANK 0
#define TAG_RESULT 1
#define TAG_ROW 2
#define TAG_FINISHOFF 3
int mpi_call_result, my_rank, dimension, np;
// forward declarations
void doInitWork(int argc, char **argv);
void doMasterTasks(int argc, char **argv);
void doWorkerTasks(void);
void finalize();
void quit(const char *msg, int mpi_call_result);
void shutdownWorkers() {
printf("All work …Run Code Online (Sandbox Code Playgroud)