2010-07-31 36 views
2

我正在尝试编写Java串行设备驱动程序,并且想要使用(新到我的)java.util.concurrent包。我有一种方法发送一个数据包,然后等待一个ACK。我打算有字符。接待在不同的线程中运行。如果接收线程得到ACK,它应该通过发送包功能通知线程。接收线程实现一个状态机并且应该通知任何解码数据包的监听者。Java:使用Java.util.concurrent线程访问线程化串行端口

我想我知道如何使用直接线程,wait,notify等,但我不知道如何做到这一点与新的并发包。将非常感谢任何指针。

回答

4

使用CyclicBarrier。以下是Javadoc的一个相关实例:

一种同步协助,它允许一组线程互相等待以达到共同障碍点。 CyclicBarriers在涉及固定大小的线程的程序中很有用,它必须偶尔等待对方。该屏障称为循环,因为它可以在等待线程释放之后重新使用。

所以,你需要创建一些2各方的CyclicBarrier并让接收器线程ACK后调用await(),让发件人线程做SEND之前调用await()

这是SSCCE为您开始。

package com.stackoverflow.q3379797; 

import java.util.concurrent.CyclicBarrier; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

public class Test { 

    public static void main(String[] args) { 
     CyclicBarrier barrier = new CyclicBarrier(2); 
     Receiver receiver = new Receiver(barrier); 
     Sender sender = new Sender(barrier); 

     ExecutorService executor = Executors.newFixedThreadPool(2); 
     executor.submit(receiver); 
     executor.submit(sender); 
    } 

} 

class Receiver implements Runnable { 

    private CyclicBarrier barrier; 

    public Receiver(CyclicBarrier barrier) { 
     this.barrier = barrier; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       // Wait for ACK (the sleep just simulates that). 
       Thread.sleep(2000); 
       System.out.println("ACK"); 

       // Then notify. 
       barrier.await(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

class Sender implements Runnable { 

    private CyclicBarrier barrier; 

    public Sender(CyclicBarrier barrier) { 
     this.barrier = barrier; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       // Wait for notify. 
       barrier.await(); 

       // Now do SEND. 
       System.out.println("SEND"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

你会看到在标准输出如下:

 
(2 seconds) 
ACK 
SEND 
(2 seconds) 
ACK 
SEND 
(2 seconds) 
ACK 
SEND 
+0

谢谢你,优秀的答案,正是我一直在寻找。 – 2010-08-01 01:38:48

+0

不客气。 – BalusC 2010-08-01 02:08:12