Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 循环屏障再利用?_Java_Multithreading_Sockets_Concurrency_Cyclicbarrier - Fatal编程技术网

Java 循环屏障再利用?

Java 循环屏障再利用?,java,multithreading,sockets,concurrency,cyclicbarrier,Java,Multithreading,Sockets,Concurrency,Cyclicbarrier,我目前正在尝试实现一个与机器通信的应用程序,其基本工作原理如下: 程序向服务器发送消息(在本例中,为文件的前255字节) 机器以“消息成功接收”或“错误”响应 接收消息“响应” 然后,程序必须根据机器的响应决定是否发送下一条消息(下一个255字节)(上一条消息出错,必须重新启动) 依此类推程序需要发送的每条消息(取决于文件的大小) 因此,我们考虑使用一个线程进行发送,另一个线程进行接收,因为我们有一个api来注册一个类作为从机器接收消息的类(只需实现一个接口),并且向机器发送消息的方法不是阻

我目前正在尝试实现一个与机器通信的应用程序,其基本工作原理如下:

  • 程序向服务器发送消息(在本例中,为文件的前255字节)
  • 机器以“消息成功接收”或“错误”响应 接收消息“响应”
  • 然后,程序必须根据机器的响应决定是否发送下一条消息(下一个255字节)(上一条消息出错,必须重新启动)
  • 依此类推程序需要发送的每条消息(取决于文件的大小)
因此,我们考虑使用一个线程进行发送,另一个线程进行接收,因为我们有一个api来注册一个类作为从机器接收消息的类(只需实现一个接口),并且向机器发送消息的方法不是阻塞类型,因此,需要一种等待机器响应的方法,以便程序能够在响应到达后决定要做什么

因此,我们需要以某种方式同步这两个线程,因为可以确定它们将交换多少消息,这使我们尝试使用CyclicBarrier。这是用于测试CyclicBarrier是否能帮助我们解决此问题的代码(该程序实际上不使用套接字与机器通信,这只是用于测试屏障):

问题是:

  • 如何使屏障可重复使用?那是自动的还是自动的 要手工做吗

  • 程序挂起是因为我丢失了套接字(或屏障代码)


它挂起的原因是您正在打开一个到服务器的连接并继续向其发送数据,但在接收端,您正在放弃第一个连接,并开始等待下一个连接发生

您可以在每次发送数据时从发件人创建新连接。代码块

Socket sender = new Socket("localhost", 8080);
PrintWriter pw = new PrintWriter(sender.getOutputStream(), true);
必须在for循环内移动。(当然,要注意释放所有资源)

或者


将接收器修复为从第一个连接读取数据,而不是等待第二个数据包的新连接。

Nice…:)现在它可以工作了(程序根本不挂起,等待消息)。但是,当您说“修复接收器以从第一个连接读取数据”时,您的意思是什么?即移动“套接字响应=ss.accept();BufferedReader br=新的BufferedReader(新的InputStreamReader(response.getInputStream());“离开while循环,并继续从该连接读取下一行数据。由于发送和接收是顺序进行的,所以所有工作都可以在单个线程中完成。两个线程是不必要的复杂化和资源浪费。我也这么认为,但我们在尝试将其顺序化时遇到了问题,因为标记为接收消息的对象通过硬件中断收到传入消息的通知,对此我们没有控制权,发生的速度甚至比程序等待机器响应的速度还要快,因此有时会丢失消息;在我们的例子中有些不可接受的东西,因为这些文件实际上是智能卡芯片的操作系统。你在说什么硬件中断?您显示的文本仅使用标准套接字和服务器套接字用法。然后,在测试中,客户端线程和服务器线程都使用单个屏障。事实上,客户机和服务器运行在不同的进程中,无法访问同一个对象。这就是为什么我说我不使用它们与机器对话,它们在那里是为了查看屏障是如何工作的;我认为它们足以制作一个简单的握手场景,从技术上讲,机器不是服务器,所有程序(发送/接收线程)都在一台计算机上运行;机器只响应以这种/那种方式发送给它的内容,这取决于它的内部协议。中断来自用于与机器通信的PCI卡,该卡通过我们可以通过java库与之交互的专有驱动程序进行处理。
Waiting message...
Sending message:
Received: Message!
done.
Waiting message...
Sending message:
Socket sender = new Socket("localhost", 8080);
PrintWriter pw = new PrintWriter(sender.getOutputStream(), true);