Вы намерены записать данные в один файл. Поэтому, если вы попытаетесь заблокировать весь файл, для выполнения этой задачи лучше использовать один поток. Хотя вы создаете 20 потоков, но только один из них запускается каждый раз, когда вы вызываете метод, остальные просто ждут блокировки.
Я рекомендую вам использовать RandomAccessFile
для записи данных в файл. Затем каждый поток может записывать в файл некоторые уникальные данные без блокировки всего файла.
Некоторые демо-код следующим образом
try {
final RandomAccessFile file = new RandomAccessFile("/path/to/your/result.txt", "rw");
final int numberOfThread = 20;
final int bufferSize = 512;
ExecutorService pool = Executors.newFixedThreadPool(numberOfThread);
final AtomicInteger byteCounter = new AtomicInteger(0);
final byte[] yourText = "Your data".getBytes();
for (int i = 0; i < yourText.length; i++) {
pool.submit(new Runnable() {
@Override
public void run() {
int start = byteCounter.getAndAdd(bufferSize);
int chunkSize = bufferSize;
if (start + bufferSize > yourText.length) {
chunkSize = yourText.length - start;
}
byte[] chunkData = new byte[chunkSize];
System.arraycopy(yourText, start, chunkData, 0, chunkSize);
try {
file.write(chunkData);
} catch (IOException e) {
//exception handle
}
}
});
}
file.close();
} catch (Exception e) {
//clean up
}
просто интересно, вы получили такое же домашнее задание? http://stackoverflow.com/questions/9972549/threads-and-file-writing –
20 нитей .. 20 нитей .. каковы шансы? –
различный количество линий .. другой количество линий .. –