Das können Sie nicht.
Sie werden immer blockieren, während Sie darauf warten, dass die Festplatte Ihnen Daten liefert. Wenn Sie mit jedem Datenpaket viel Arbeit zu erledigen haben, kann die Verwendung eines zweiten Threads hilfreich sein: Dieser Thread kann CPU-intensive Arbeit an den Daten durchführen, während der erste Thread blockiert ist und auf den Abschluss des nächsten Lesevorgangs wartet.
Aber das klingt nicht nach Ihrer Situation.
Am besten ist es, Daten in möglichst großen Blöcken zu lesen (z. B. 1 MB oder mehr). Dadurch wird die im Kernel blockierte Zeit minimiert und die Wartezeit auf die Festplatte verkürzt (wenn die zu lesenden Blöcke zusammenhängend sind).
Hier ist der Codez
ExecutorService exec = Executors.newFixedThreadPool(1);
// use RandomAccessFile because it supports readFully()
RandomAccessFile in = new RandomAccessFile("myfile.dat", "r");
in.seek(0L);
while (in.getFilePointer() < in.length())
{
int readSize = (int)Math.min(1000000, in.length() - in.getFilePointer());
final byte[] data = new byte[readSize];
in.readFully(data);
exec.execute(new Runnable()
{
public void run()
{
// do something with data
}
});
}