小编Chr*_*tof的帖子

Groovy方法重载:方法的选择比子类更喜欢接口吗?

您好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 groovy overloading

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

Java多线程服务器*有时*在ServerSocket.accept()方法中抛出SocketException(Socket关闭)

我一直在研究这个问题好几个小时,我无法得到一个像样的解决方案或解释为什么这个异常(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)

java multithreading exception

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

简单的MPI发送/接收程序中的行为不清楚

一段时间以来,我的代码中一直存在错误,无法弄清楚如何解决它.

我想要实现的是很容易的:每个工作节点(即具有等级!= 0的节点)在涉及一些计算的方形结构中获得一行(由1维arry表示).计算完成后,该行将被发送回主服务器.

出于测试目的,不涉及计算.所有发生的事情是:

  • master向worker发送行号,worker使用行号来计算相应的值
  • worker返回带有结果值的数组

现在,我的问题是:

  • 对于一行中的元素数量(大小= 1006)和工人数量> 1,所有工作都按预期工作到一定大小
  • 如果一行中的元素超过1006,则工作程序无法关闭,程序也不会终止
  • 这只有在我尝试将数组发送回主服务器时才会发生.如果我只是发回一个INT,那么一切都OK(参见doMasterTasks()和doWorkerTasks()中注释掉的行)

基于最后一个要点,我假设必须存在一些竞争条件,这些竞争条件仅在要发送回主设备的阵列达到一定大小时才会出现.

你知道问题是什么吗?

使用以下代码编译以下代码: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)

c mpi worker

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

标签 统计

java ×2

c ×1

exception ×1

groovy ×1

mpi ×1

multithreading ×1

overloading ×1

worker ×1