-1

我的程序 ( MAIN) 有两个与 com 端口 ( COM) 和 TCP 会话 ( TCP) 通信的线程。

如果 main ( MAIN) 程序需要来自模块的信息,TCPCOM会发送请求消息R( tRand cR)。当线程有答案时,它们会发回答案AtA并且cA)。我有问题,当我将请求发送到COMcR)并且没有从它得到答案时,答案来自TCP- tACOM R-A应该以某种方式与 TCP 中断隔离。如何使用 JAVA 1.4 解决这个问题?

在此处输入图像描述

UPD。在tA事件MAIN 启动cR时 - 请求COM端口。Main 可以COM自己发起请求。我想避免在COM没有从第一个问题得到答案的情况下移植第二个问题。

UPD2。实际上整个系统如下图所示。cR可能由tA或开始uR。并且cA可以回答TCPviatR或 to UIvia uA在此处输入图像描述 以下场景是正确的

uR->cR->cA->tR-tA->cR->cA->uA
cA->tR->tA->cR
uR->cR->cA->uA

当两个请求同时发送到 COM 时,我遇到了麻烦。

cA->tR->tA->cR
uR->cR

我只想在 COM 向第一个调用者返回答案的情况下才允许新请求。

4

3 回答 3

0

据我了解,您在 main 方法中有 2 个线程。1 个线程与 TCP 交互,另一个与 COM 交互。正确的?如果是这种情况,您可以做的是让线程 1 处理所有 TCP 请求/响应,让线程 2 处理所有 COM 请求/响应。而主线程并没有意识到这一点。直到两个线程独立完成它们的工作,主线程才会等待,一旦两个线程都完成了它们的工作,主线程就可以恢复它的工作。因此 COM 和 TCP 的通信是完全分开的。你可以在这里使用线程“join()”方法。

我回答你的问题了吗?

于 2015-08-18T18:02:57.137 回答
0

您不必使用多个线程。只需从套接字读取请求,通过 COM 端口通信同步处理请求,然后通过套接字写入响应。

不过,使用多线程可能是有原因的。例如,如果 COM 端口响应不够快,也许您希望能够以超时错误响应套接字请求,但您使用的串行端口库不支持超时配置。在这种情况下,您必须阐明您的要求。如果从套接字接收到另一个请求,但 COM 线程仍然卡在处理前一个请求,你想发生什么?您可以等待,立即响应错误等。

创建一个单线程 ExecutorService每当您需要与 COM 端口交互时,无论请求来自套接字还是来自主程序本身,都将任务提交给该服务。这将确保串行通信不会与竞争请求交错。

这里的基本思想是只允许一个线程使用 COM 端口,消耗由其他各种线程产生的任务队列。

于 2015-08-18T20:30:39.260 回答
0

这是一个可以解释您的系统的示例。在这里,我制作了一个呼叫者接收者的环境。直到来电者没有以他或她的陈述结束时,接收者才能开始说任何话或回应来电者。

调用者.java

public class Caller implements Runnable {

    MaintainACall call;

    Caller(MaintainACall me)
    {
        call=me;
        new Thread(this,"Mr X").start();
    }
    public void run()
    {
        String a[]={"Hello how r u", "I'm in vadodara"};
        for(int i=0;i<2;i++)
        {

            call.sayHello(a[i]);
        }

    }

}

接收器.java

public class Reciver implements Runnable {

    MaintainACall call;

    Reciver(MaintainACall call)
    {
        this.call=call;
        new Thread(this,"Mr Y").start();
    }
    public void run()
    {

        call.Wtshesay();

    }

}

维护ACall.java

public class MaintainACall {

    String say;
    boolean valueSet=false;

    synchronized String Wtshesay()
    {
        while(!valueSet)
            try
            {
                wait();
            }
            catch(InterruptedException ie)
            {
                System.out.println(ie);
            }
        System.out.println("I have heared "+say);
        valueSet=false;
        notify();
        return say;
    }

    synchronized void sayHello(String msg)
    {
        while(valueSet)
            try
            {
                wait();
            }
            catch(InterruptedException ie)
            {
                System.out.println(ie);
            }
        say=msg;
        valueSet=true;
        System.out.println("She says "+say);        
        notify();
    }

}

主类.java

public class MainClass {
    public static void main(String arg[])
    {
        MaintainACall my=new MaintainACall();
        new Caller(my);
        new Reciver(my);
    }

}
于 2015-08-18T18:15:28.350 回答