Java 主程序中的两个线程并发
我有一个程序(Java 主程序中的两个线程并发,java,multithreading,java1.4,Java,Multithreading,Java1.4,我有一个程序(MAIN),它有两个线程与com端口(com)和TCP会话(TCP)通信 如果main(main)程序需要来自TCP和COM模块的信息,它将发送请求消息R(tR和cR)。当线程有应答时,它们会发回应答A(tA和cA)。我有问题,当我将reguest发送到COM(cR)时,没有从中获得答案,而是从TCP-tA获得答案COMR-A应该以某种方式与TCP中断隔离。如何使用Java1.4解决这个问题 UPD。在tA上,事件MAIN启动cR-请求COM端口。Main可以自行启动对COM的请
MAIN
),它有两个线程与com端口(com
)和TCP会话(TCP
)通信
如果main(main
)程序需要来自TCP
和COM
模块的信息,它将发送请求消息R
(tR
和cR
)。当线程有应答时,它们会发回应答A
(tA
和cA)
。我有问题,当我将reguest发送到COM
(cR
)时,没有从中获得答案,而是从TCP
-tA
获得答案COM
R-A
应该以某种方式与TCP中断隔离。如何使用Java1.4解决这个问题
UPD。在tA
上,事件MAIN
启动cR
-请求COM
端口。Main可以自行启动对COM
的请求。我希望避免在没有得到第一个问题的答案的情况下,向COM
端口提出第二个问题
UPD2。实际上整个系统如下图所示cR
可以由tA
或uR
启动。而cA
可以通过tR
对TCP
进行应答,或者通过uA对UI
进行应答。
以下情况是正确的
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方法中有两个线程。一个线程与TCP交互,另一个线程与COM交互。对吗?
如果是这种情况,那么可以让handle线程1处理所有TCP请求/响应,让handle线程2处理所有COM请求/响应。主线程没有意识到这一点。直到两个线程独立地完成它们的工作,主线程才会等待,一旦两个线程都完成了它们的工作,主线程就可以继续它的工作。因此,COM和TCP的通信是完全分离的。您可以在这里使用Threads“join()”方法
我回答你的问题了吗?这里有一个例子可以解释你的系统。在这里,我创建了一个调用方接收器的环境。直到呼叫者没有以他或她的陈述结束,接收者才能开始说任何话或回应呼叫者
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]);
}
}
}
public class Reciver implements Runnable {
MaintainACall call;
Reciver(MaintainACall call)
{
this.call=call;
new Thread(this,"Mr Y").start();
}
public void run()
{
call.Wtshesay();
}
}
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();
}
}
public class MainClass {
public static void main(String arg[])
{
MaintainACall my=new MaintainACall();
new Caller(my);
new Reciver(my);
}
}
maintacacall.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]);
}
}
}
public class Reciver implements Runnable {
MaintainACall call;
Reciver(MaintainACall call)
{
this.call=call;
new Thread(this,"Mr Y").start();
}
public void run()
{
call.Wtshesay();
}
}
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();
}
}
public class MainClass {
public static void main(String arg[])
{
MaintainACall my=new MaintainACall();
new Caller(my);
new Reciver(my);
}
}
MainClass.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]);
}
}
}
public class Reciver implements Runnable {
MaintainACall call;
Reciver(MaintainACall call)
{
this.call=call;
new Thread(this,"Mr Y").start();
}
public void run()
{
call.Wtshesay();
}
}
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();
}
}
public class MainClass {
public static void main(String arg[])
{
MaintainACall my=new MaintainACall();
new Caller(my);
new Reciver(my);
}
}
您不必使用多个线程。只需从套接字读取请求,通过COM端口通信同步处理请求,然后通过套接字写入响应
不过,使用多线程可能有其原因。例如,如果COM端口响应速度不够快,但您使用的串行端口库不支持超时配置,则您可能希望能够使用超时错误响应套接字请求。在这种情况下,您必须澄清您的需求。如果从套接字接收到另一个请求,但COM线程仍无法处理前一个请求,您希望发生什么?您可以等待,立即以错误响应,等等
无论请求是来自套接字还是来自主程序本身,只要需要与COM端口进行交互,都可以创建一个连接到该服务的任务。这将确保串行通信不会与竞争请求交错
这里的基本思想是只允许一个线程使用COM端口,使用由其他线程生成的任务队列。对不起,Vico,您的问题不完全清楚。是否有一个线程专用于将请求写入COM端口并等待响应?另一个对TCP也是这样吗?这两个线程如何相互作用?当你谈到“打扰”时,你到底是什么意思?换句话说,使用两个独立连接的两个独立线程通常不会相互干扰或交互;您必须编写代码来协调它们。你有什么?你所说的“同意”是什么意思?我已经在我更新的消息正文中更新了我的问题