@Test
public void testSubprocessReactorKillByInterruption() throws Exception {

	ProcessChannel<String> processChannel = _localProcessExecutor.execute(
		_createJPDAProcessConfig(_JPDA_OPTIONS1),
		Operations.asControllable(Operations.SLEEP));
	Future<Controller> future = processChannel.write(
		Operations.GET_CONTROLLER);
	Controller controller = future.get();
	Assert.assertTrue(controller.isAlive());
	Map<String, Object> attributes =
		LocalProcessLauncher.ProcessContext.getAttributes();
	BlockingQueue<Thread> reactorThreadBlockingQueue =
		new SynchronousQueue<>();
	attributes.put(
		"reactorThreadBlockingQueue", reactorThreadBlockingQueue);
	controller.invoke(
		() -> {
			try {
				LocalProcessLauncher.ProcessContext.writeProcessCallable(
					() -> {
						Map<String, Object> localAttributes =
							LocalProcessLauncher.ProcessContext.
								getAttributes();
						BlockingQueue<Thread>
							localReactorThreadBlockingQueue =
								(BlockingQueue<Thread>)
									localAttributes.remove(
										"reactorThreadBlockingQueue");
						try {
							localReactorThreadBlockingQueue.put(
								Thread.currentThread());
						}
						catch (InterruptedException interruptedException) {
							throw new ProcessException(
								interruptedException);
						}
						return null;
					});
				Object processOutputStream =
					ReflectionTestUtil.getFieldValue(
						LocalProcessLauncher.ProcessContext.class,
						"_processOutputStream");
				ReflectionTestUtil.invoke(
					processOutputStream, "close", new Class<?>[0]);
			}
			catch (IOException ioException) {
				throw new ProcessException(ioException);
			}
			return null;
		});
	Thread reactorThread = reactorThreadBlockingQueue.take();
	reactorThread.interrupt();
	NoticeableFuture<String> noticeableFuture =
		processChannel.getProcessNoticeableFuture();
	try {
		noticeableFuture.get();
		Assert.fail();
	}
	catch (ExecutionException executionException) {
		Throwable throwable = executionException.getCause();
		Assert.assertSame(ProcessException.class, throwable.getClass());
		Assert.assertEquals(
			"Forcibly killed subprocess on interruption",
			throwable.getMessage());
		throwable = throwable.getCause();
		Assert.assertSame(InterruptedException.class, throwable.getClass());
	}
}