@Test public void testAsynchronousClose() throws Exception { RegularFile file = regularFile(10); final FileChannel channel = channel(file, READ, WRITE); file.writeLock().lock(); ExecutorService executor = Executors.newCachedThreadPool(); CountDownLatch latch = new CountDownLatch(BLOCKING_OP_COUNT); List<Future<?>> futures = queueAllBlockingOperations(channel, executor, latch); latch.await(); Uninterruptibles.sleepUninterruptibly(20, MILLISECONDS); channel.close(); for (Future<?> future : futures) { try { future.get(); fail(); } catch (ExecutionException expected) { assertWithMessage("blocking thread exception") .that(expected.getCause()) .isInstanceOf(AsynchronousCloseException.class); } } }
@Override public FileLock lock(long position, long size, boolean shared) throws IOException { checkLockArguments(position, size, shared); boolean completed = false; try { begin(); completed = true; return new FakeFileLock(this, position, size, shared); } finally { try { end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } } }
JimfsFileChannel extends FileChannel { @Override public FileLock lock(long position, long size, boolean shared) throws IOException { checkLockArguments(position, size, shared); boolean completed = false; try { begin(); completed = true; return new FakeFileLock(this, position, size, shared); } finally { try { end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } } } }
JimfsFileChannel extends FileChannel { @Override public FileLock lock(long position, long size, boolean shared) throws IOException { checkLockArguments(position, size, shared); boolean completed = false; try { begin(); completed = true; return new FakeFileLock(this, position, size, shared); } finally { try { end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } } } JimfsFileChannel(
      RegularFile file, Set<OpenOption> options, FileSystemState fileSystemState); }
JimfsFileChannel extends FileChannel { @Override public FileLock lock(long position, long size, boolean shared) throws IOException { checkLockArguments(position, size, shared); boolean completed = false; try { begin(); completed = true; return new FakeFileLock(this, position, size, shared); } finally { try { end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } } } JimfsFileChannel(
      RegularFile file, Set<OpenOption> options, FileSystemState fileSystemState); AsynchronousFileChannel asAsynchronousFileChannel(ExecutorService executor); @Override int read(ByteBuffer dst); @Override long read(ByteBuffer[] dsts, int offset, int length); @Override int read(ByteBuffer dst, long position); @Override int write(ByteBuffer src); @Override long write(ByteBuffer[] srcs, int offset, int length); @Override int write(ByteBuffer src, long position); @Override long position(); @Override FileChannel position(long newPosition); @Override long size(); @Override FileChannel truncate(long size); @Override void force(boolean metaData); @Override long transferTo(long position, long count, WritableByteChannel target); @Override long transferFrom(ReadableByteChannel src, long position, long count); @Override MappedByteBuffer map(MapMode mode, long position, long size); @Override FileLock lock(long position, long size, boolean shared); @Override FileLock tryLock(long position, long size, boolean shared); }
JimfsFileChannel extends FileChannel { @Override public FileLock lock(long position, long size, boolean shared) throws IOException { checkLockArguments(position, size, shared); boolean completed = false; try { begin(); completed = true; return new FakeFileLock(this, position, size, shared); } finally { try { end(completed); } catch (ClosedByInterruptException e) { throw new FileLockInterruptionException(); } } } JimfsFileChannel(
      RegularFile file, Set<OpenOption> options, FileSystemState fileSystemState); AsynchronousFileChannel asAsynchronousFileChannel(ExecutorService executor); @Override int read(ByteBuffer dst); @Override long read(ByteBuffer[] dsts, int offset, int length); @Override int read(ByteBuffer dst, long position); @Override int write(ByteBuffer src); @Override long write(ByteBuffer[] srcs, int offset, int length); @Override int write(ByteBuffer src, long position); @Override long position(); @Override FileChannel position(long newPosition); @Override long size(); @Override FileChannel truncate(long size); @Override void force(boolean metaData); @Override long transferTo(long position, long count, WritableByteChannel target); @Override long transferFrom(ReadableByteChannel src, long position, long count); @Override MappedByteBuffer map(MapMode mode, long position, long size); @Override FileLock lock(long position, long size, boolean shared); @Override FileLock tryLock(long position, long size, boolean shared);  }