将带有线程+其他信息的运行类分解为两个不同的运行类java

时间:2017-03-21 18:57:24

标签: java multithreading

我正在面对我的学校项目的问题,这段代码完美无缺:

    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();
它给我带来了一个错误:

  

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

     

线程中的异常&#34;线程0&#34; java.lang.NullPointerException at   protocole.MinLLPReader.getMessage(MinLLPReader.java:56)at at   library.interfaces.ServeurHL7.protocole(ServeurHL7.java:84)at   interoperabilite.Serveur。(Serveur.java:28)at   interoperabilite.TestHL7Serveur.lambda $主$ 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消息时运行服务器代码,而另一台计算机运行客户端代码来传输此消息。

1 个答案:

答案 0 :(得分:0)

我找到的临时解决方案:

对于客户端我添加一个无限的线程,它工作,仍然未知原因。我明天会看得更远:

    /*
 * 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。如果有人知道为什么使用无限循环+线程这项工作请解释我:)