@Test(timeout=10000)
public void test2() throws InterruptedException
{

	// Same as test1, but for a binary processor
	int num_instances = 100, delay = 300;
	ExecutorService es = Executors.newCachedThreadPool();
	@SuppressWarnings("unused")
	List<Future<Pushable>> futures = new ArrayList<Future<Pushable>>(num_instances);
	List<Pushable> pushables0 = new ArrayList<Pushable>(num_instances);
	List<Pushable> pushables1 = new ArrayList<Pushable>(num_instances);
	List<QueueSink> sinks = new ArrayList<QueueSink>(num_instances);
	// Create 100 instances
	for (int i = 0; i < num_instances; i++)
	{
		SlowPassthrough spt = new SlowPassthrough(2, delay);
		NonBlockingPush nbp = new NonBlockingPush(spt, es);
		QueueSink sink = new QueueSink(2);
		Connector.connect(nbp, sink);
		sinks.add(sink);
		pushables0.add(nbp.getPushableInput(0));
		pushables1.add(nbp.getPushableInput(1));
	}
	// Push an event in rapid-fire fashion to each instance
	Stopwatch sw = new Stopwatch();
	sw.start();
	for (int i = 0; i < num_instances; i++)
	{
		pushables0.get(i).push(i);
		pushables1.get(i).push(2 * i);
	}
	sw.stop();
	// It took much less than num_instances * delay seconds to
	// push all these events, meaning that the calls were non-blocking
	assertTrue(sw.getDuration() < (num_instances * delay) * 0.2);
	// Wait a little more than delay
	es.awaitTermination((long) (delay * 1.2), TimeUnit.MILLISECONDS);
	// All sinks received a value, meaning that all calls to push were
	// successfully completed
	for (int i = 0; i < num_instances; i++)
	{
		QueueSink qs = sinks.get(i);
		Object o0 = qs.getQueue(0).remove();
		assertEquals(i, o0);
		Object o1 = qs.getQueue(1).remove();
		assertEquals(2 * i, o1);
	}
}