我有程序(MAIN
)有两个线程与com端口(COM
)和TCP会话(TCP
)进行通信。
如果main(MAIN
)程序需要来自TCP
和COM
模块的信息,它会发送请求消息R
(tR
和cR
)。当线程有回答时,他们发回回答A
(tA
和cA)
。我有问题,当我向COM
(cR
)发送reguest并且没有得到答案时有来自TCP
- tA
的答案.COM
R-A
应该以某种方式与TCP中断隔离。如何使用JAVA 1.4解决这个问题?
UPD。在tA
事件MAIN
发起cR
- 请求COM
端口。 Main可以自己发起对COM
的请求。我想避免在没有得到第一个答案的情况下向COM
端口提出第二个问题。
UPD2。实际上整个系统如下图所示。 cR
可能由tA
或uR
发起。 cA
可以通过TCP
回答tR
,或者通过UI
回答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返回第一个调用者的答案时才允许新请求。
据我所知,你在main方法中有2个线程。 1个线程与TCP交互,另一个与COM交互。对?如果是这种情况,那么您可以让处理线程1来处理所有TCP请求/响应,并让线程2处理所有COM请求/响应。并且主线程没有意识到这一点。直到两个线程独立完成其工作的时间,主线程等待,并且一旦两个线程完成其工作,主线程可以恢复其工作。因此,COM和TCP的通信是完全独立的。你可以在这里使用Threads“join()”方法。
我回答你的问题了吗?
您不必使用多个线程。只需从套接字读取请求,通过COM端口进行通信同步处理请求,然后通过套接字写入响应。
但是,可能有理由使用多个线程。例如,如果COM端口响应速度不够快,或者您使用的串行端口库不支持超时配置,您可能希望能够响应超时错误的套接字请求。在这种情况下,您必须澄清您的要求。如果从套接字收到另一个请求,但是COM线程仍在处理先前的请求时,您希望发生什么?您可以等待,立即回复错误等。
创建single-thread ExecutorService
.无论何时需要与COM端口进行交互,无论请求是来自套接字还是来自主程序本身,submit都会将此任务交给此服务。这将确保串行通信不会与竞争请求交错。
这里的基本思想是只允许一个线程使用COM端口,消耗由各种其他线程产生的任务队列。
这是一个可以解释您的系统的示例。在这里,我创造了一个呼叫接收器的环境。直到来电者不以他或她的陈述结束接收者不能开始说什么或回应来电者。
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();
}
}
maintain A call.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();
}
}
main class.Java
public class MainClass {
public static void main(String arg[])
{
MaintainACall my=new MaintainACall();
new Caller(my);
new Reciver(my);
}
}