【问题标题】:Decomposing a run class with a thread+other information into two different run class java将一个带有线程+其他信息的运行类分解成两个不同的运行类java
【发布时间】:2017-08-13 15:20:25
【问题描述】:

我的学校项目遇到问题,这段代码运行良好:

    String adresse = "localhost";
    int port = 6565;
    new Thread(() -> {
        Serveur serveur = new Serveur(port);
        Patient ps;

        String messageHL7 = serveur.getMessageHL7();
        String messageHL7final = serveur.getMessageHL7lisible();
        System.out.println("---------------------------------------");
        System.out.println("messageHL7final : ");
        System.out.println(messageHL7final);
        System.out.println("---------------------------------------");
        ps = serveur.getPs();
        Parser parse = new Parser(messageHL7);
        System.out.println("---------------------------------------");
        System.out.println("parser : ");
        System.out.println(parse.getPatient().getBirth());
        System.out.println("---------------------------------------");
        serveur.fermeture();
        System.out.println("---------------------------------------");
        System.out.println("Patient serveur nom de famille : " + ps.getFamillyName());
        System.out.println("Patient serveur prénom : " + ps.getFirstName());
        System.out.println("Patient serveur IPP : " + ps.getID());
        System.out.println("Patient serveur est mort : " + ps.isDeath());
        System.out.println("Patient serveur sexe : " + ps.getCharSex());
        System.out.println("Patient serveur date de naissance : " + ps.getBirth());
        System.out.println("---------------------------------------");
    }).start();

    DPI dpi = DAOFactory.getDpiDAO().find(new ArrayList<>(Arrays.asList("IPP")), new ArrayList<>(Arrays.asList("170000001")));

    Client client = new Client(dpi, adresse, port);

    System.out.println("---------------------------------------");
    System.out.println("Patient de la base de donnée: " + dpi.toString());
    System.out.println("---------------------------------------");

    System.out.println("---------------------------------------");
    System.out.println("test : ");
    Patient p = client.getP();
    System.out.println("---------------------------------------");

    System.out.println("---------------------------------------");
    System.out.println("Patient client nom de famille : " + p.getFamillyName()
            + "\nPatient client prénom : " + p.getFirstName()
            + "\nPatient client sexe : " + p.getCharSex()
            + "\nPatient client date de naissance : " + p.getBirth()
            + "\nPatient clientIPP : " + p.getID()
            + "\nPatient client est mort : " + p.isDeath()
            + "\nPatient client date de décès : " + p.getDeath()
            + "\nPatient client est parti le : " + p.getDateDicharge());
    System.out.println("---------------------------------------");

给我这个回复:

---------------------------------------
Patient de la base de donnée: Guille Angélique, FEMME, né(e) le  1970-10-21 IPP : 170000001
---------------------------------------
---------------------------------------
test : 
---------------------------------------
---------------------------------------
Patient client nom de famille : Angélique
Patient client prénom : Guille
Patient client sexe : F
Patient client date de naissance : Wed Oct 21 19:20:13 CET 1970
Patient clientIPP : 170000001
Patient client est mort : false
Patient client date de décès : null
Patient client est parti le : null
---------------------------------------
year:null
month:null
day:null
hour:null
minutes:null
seconde:null
-------------apresProtocole-----------------
date de naissanceWed Oct 21 19:20:13 CET 1970
---------------------------------------
messageHL7final : 
MSH|^~\&|||||20170321192013+0100||ADT^A01|1525900894|P|2.5||||||||||
EVN|A01|20170321192013+0100|||||
PID|1||170000001||Angélique^Guille||19701021192013+0100|F|||||||||||||||||||||N||||||||||||||||||||||
PV1||Inpatient|^^^^^^^^|||^^^^^^^^||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


---------------------------------------
year:null
month:null
day:null
hour:null
minutes:null
seconde:null
---------------------------------------
parser : 
Mon Nov 21 19:20:13 CET 3870
---------------------------------------
---------------------------------------
Patient serveur nom de famille : Angélique
Patient serveur prénom : Guille
Patient serveur IPP : 170000001
Patient serveur est mort : false
Patient serveur sexe : F
Patient serveur date de naissance : Wed Oct 21 19:20:13 CET 1970
---------------------------------------

但是当我尝试分解服务器和客户端时(我删除了sout):

服务器可运行:

int port = 6565;//port d'écoute de mon serveur
    new Thread(() -> {
        Serveur serveur = new Serveur(port);
        Patient ps;

        String messageHL7 = serveur.getMessageHL7();
        String messageHL7final = serveur.getMessageHL7lisible();
        ps = serveur.getPs();
        Parser parse = new Parser(messageHL7);
    }).start();

和客户端可运行:

    String adresse = "localhost"; //adresse du serveur à joindre
    int port = 6565; //port d'écoute du serveur

    DPI dpi = DAOFactory.getDpiDAO().find(new ArrayList<>(Arrays.asList("IPP")), new ArrayList<>(Arrays.asList("170000001")));

    Client client = new Client(dpi, adresse, port);
    Patient p = client.getP();

它给我带来了一个错误:

2017 年 3 月 21 日 7:25:02 PM protocole.MinLLPReader getMessage GRAVE: null java.net.SocketException:连接重置在 java.net.SocketInputStream.read(SocketInputStream.java:209) 在 java.net.SocketInputStream.read(SocketInputStream.java:141) 在 sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) 在 sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) 在 sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) 在 java.io.InputStreamReader.read(InputStreamReader.java:184) 在 java.io.BufferedReader.fill(BufferedReader.java:161) 在 java.io.BufferedReader.readLine(BufferedReader.java:324) 在 java.io.BufferedReader.readLine(BufferedReader.java:389) 在 protocole.MinLLPReader.getMessage(MinLLPReader.java:50) 在 library.interfaces.ServeurHL7.protocole(ServeurHL7.java:84) 在 互操作性.Serveur.(Serveur.java:28) 在 interoperabilite.TestHL7Serveur.lambda$main$0(TestHL7Serveur.java:24) 在 java.lang.Thread.run(Thread.java:745)

线程“Thread-0”中的异常 java.lang.NullPointerException at protocole.MinLLPReader.getMessage(MinLLPReader.java:56) 在 library.interfaces.ServeurHL7.protocole(ServeurHL7.java:84) 在 互操作性.Serveur.(Serveur.java:28) 在 interoperabilite.TestHL7Serveur.lambda$main$0(TestHL7Serveur.java:24) 在 java.lang.Thread.run(Thread.java:745)

因此,在此之后,我在互联网上寻求帮助,但没有找到与我相近的案例。 困扰我的是,当他们在一起时它会起作用,但如果我把它们分开,它就不起作用了。

我看了这个帖子: communication between run() method and other class method (java threads) 因此这个解释 http://javarevisited.blogspot.fr/2012/07/countdownlatch-example-in-java.html 但没有得到解释。而且我什至不知道这是否相似,因为最终目标是一台计算机在需要接收 HL7 消息时运行服务器代码,而另一台计算机运行客户端代码来传输此消息。

【问题讨论】:

  • 如果您只运行服务器而不运行客户端,它是否sout 患者详细信息?或者,如果两者都运行,但删除服务器线程中除Serveur serveur = new Serveur(port);之外的所有代码,它是否有效?
  • 尝试将您的输入过大减少为 true minimal reproducible example;顺便说一句:然后将该代码翻译成英文。将大大提高您获得答案的机会。

标签: java multithreading


【解决方案1】:

我找到的临时解决方案:

对于客户端,我添加了一个无限长的线程并且它工作,仍然未知为什么。我明天再看:

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package interoperabilite;

import api.Parser;
import db.GestionnaireDB.DAOFactory;
import java.util.ArrayList;
import java.util.Arrays;
import library.interfaces.Patient;
import nf.DPI.DPI;

/**
 *
 * @author quentin
 */
public class TestHL7Client {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String adresse = "localhost"; //adresse du serveur à joindre
        int port = 6565; //port d'écoute du serveur
        new Thread(() -> {
            while(true){

            }
        }).start();
        DPI dpi = DAOFactory.getDpiDAO().find(new ArrayList<>(Arrays.asList("IPP")), new ArrayList<>(Arrays.asList("170000001")));

        Client client = new Client(dpi, adresse, port);

        System.out.println("---------------------------------------");
        System.out.println("Patient de la base de donnée: " + dpi.toString());
        System.out.println("---------------------------------------");

        System.out.println("---------------------------------------");
        System.out.println("test : ");
        Patient p = client.getP();
        System.out.println("---------------------------------------");

        System.out.println("---------------------------------------");
        System.out.println("Patient client nom de famille : " + p.getFamillyName()
                + "\nPatient client prénom : " + p.getFirstName()
                + "\nPatient client sexe : " + p.getCharSex()
                + "\nPatient client date de naissance : " + p.getBirth()
                + "\nPatient clientIPP : " + p.getID()
                + "\nPatient client est mort : " + p.isDeath()
                + "\nPatient client date de décès : " + p.getDeath()
                + "\nPatient client est parti le : " + p.getDateDicharge());
        System.out.println("---------------------------------------");
    }

}

而服务器部分仍然是:

    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package interoperabilite;

import api.Parser;
import library.interfaces.Patient;

/**
 *
 * @author quentin
 */
public class TestHL7Serveur {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int port = 6565;//port d'écoute de mon serveur
        new Thread(() -> {
            Serveur serveur = new Serveur(port);
            Patient ps;

            System.out.println("TestHL7Serveur");
            String messageHL7 = serveur.getMessageHL7();
            String messageHL7final = serveur.getMessageHL7lisible();
            System.out.println("---------------------------------------");
            System.out.println("messageHL7final : ");
            System.out.println(messageHL7final);
            System.out.println("---------------------------------------");
            ps = serveur.getPs();
            Parser parse = new Parser(messageHL7);
            System.out.println("---------------------------------------");
            System.out.println("parser : ");
            System.out.println(parse.getPatient().getBirth());
            System.out.println("---------------------------------------");
            serveur.fermeture();
            System.out.println("---------------------------------------");
            System.out.println("Patient serveur nom de famille : " + ps.getFamillyName());
            System.out.println("Patient serveur prénom : " + ps.getFirstName());
            System.out.println("Patient serveur IPP : " + ps.getID());
            System.out.println("Patient serveur est mort : " + ps.isDeath());
            System.out.println("Patient serveur sexe : " + ps.getCharSex());
            System.out.println("Patient serveur date de naissance : " + ps.getBirth());
            System.out.println("---------------------------------------");
        }).start();
    }
}

客户端发送:

-----------testConnexion------------
PV1: PV1||Inpatient|^^^^^^^^|||^^^^^^^^||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---------------------------------------
Patient de la base de donnée: Guille Angélique, FEMME, né(e) le  1970-10-21 IPP : 170000001
---------------------------------------
---------------------------------------
test : 
---------------------------------------
---------------------------------------
Patient client nom de famille : Angélique
Patient client prénom : Guille
Patient client sexe : F
Patient client date de naissance : Wed Oct 21 22:08:52 CET 1970
Patient clientIPP : 170000001
Patient client est mort : false
Patient client date de décès : null
Patient client est parti le : null
---------------------------------------

服务器收到:

year:null
month:null
day:null
hour:null
minutes:null
seconde:null
date de naissanceWed Oct 21 22:08:52 CET 1970
TestHL7Serveur
---------------------------------------
messageHL7final : // HL7 message:
MSH|^~\&|||||20170321220852+0100||ADT^A01|-1254244946|P|2.5||||||||||
EVN|A01|20170321220852+0100|||||
PID|1||170000001||Angélique^Guille||19701021220852+0100|F|||||||||||||||||||||N||||||||||||||||||||||
PV1||Inpatient|^^^^^^^^|||^^^^^^^^||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


---------------------------------------
year:null
month:null
day:null
hour:null
minutes:null
seconde:null
---------------------------------------
parser : 
Mon Nov 21 22:08:52 CET 3870
---------------------------------------
---------------------------------------
Patient serveur nom de famille : Angélique
Patient serveur prénom : Guille
Patient serveur IPP : 170000001
Patient serveur est mort : false
Patient serveur sexe : F
Patient serveur date de naissance : Wed Oct 21 22:08:52 CET 1970
---------------------------------------

我认为我会从服务器向客户端发送一条消息以停止无限循环,因为它是以这种方式工作的。

我将使用最小的完整和可验证的方式进行更新,但这很棘手,因为我们使用的是编译好的 API。如果有人知道为什么使用无限循环+线程这项工作,请解释一下:)

【讨论】:

    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多