主程序中的两个线程混乱

时间:2015-08-18 17:53:44

标签: java multithreading java1.4

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

如果主要(MAIN)计划需要来自TCPCOM模块的信息,则会发送请求消息RtRcR) 。当线程有回答后,他们会回复AtAcA)。我有问题,当我向COM cR发送请求而没有得到答案来自TCP - tACOM R-A应该以某种方式与TCP中断隔离。如何使用JAVA 1.4解决此问题?

enter image description here

UPD。在tA事件MAIN发起cR - 请求COM端口。 Main可以自行向COM发起请求。我想避免在没有得到第一个答案的情况下向COM端口提出第二个问题。

UPD2。实际上整个系统如下图所示。 cR可能由tAuR启动。 cA可以通过TCPtR通过UI回复uAenter image description here 以下方案是正确的

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

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

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

我想仅在COM向第一个调用者返回答案时才允许新请求。

3 个答案:

答案 0 :(得分:0)

据我所知,你在main方法中有2个线程。 1个线程与TCP交互,另一个与COM交互。对? 如果是这种情况,那么您可以让处理线程1来处理所有TCP请求/响应,并让线程2处理所有COM请求/响应。并且主线程没有意识到这一点。直到两个线程独立完成其工作的时间,主线程等待,并且一旦两个线程完成其工作,主线程可以恢复其工作。因此,COM和TCP的通信是完全独立的。你可以使用Threads" join()"这里的方法。

我是否回答了你的问题?

答案 1 :(得分:0)

以下是一个可以解释您的系统的示例。在这里,我创造了一个呼叫接收器的环境。直到来电者不以他或她的陈述结束接收者不能开始说什么或回应来电者。

<强> Caller.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]);
        }

    }

}

<强> Receiver.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();

    }

}

<强> MaintainACall.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();
    }

}

<强> MainClass.java

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

}

答案 2 :(得分:0)

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

但是可能有理由使用多个线程。例如,如果COM端口响应速度不够快,或者您使用的串行端口库不支持超时配置,您可能希望能够响应超时错误的套接字请求。在这种情况下,您必须澄清您的要求。如果从套接字收到另一个请求,但是COM线程仍在处理先前的请求时,您希望发生什么?您可以等待,立即回复错误等等。

创建single-thread ExecutorService.每当您需要与COM端口进行交互时,无论请求是来自套接字还是来自主程序本身,submit该任务都是针对此服务的。这将确保串行通信不会与竞争请求交错。

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