Алоха!
Самым, наверное, интересным событием на этой неделе в мире Java стала конференция JPoint, которая прошла в Центре Международной Торговли в Москве. Одноклассники предложили посетителям тоже поучаствовать в разработке самой высоконагруженной системы на Java и помочь нашим разработчикам в решении практических задач, с которыми они сталкиваются в своей работе.
Одиннадцать человек, лучше всех решивших эти задачки, уже получили от нас призы, ну а для остальных мы запилили этот пост с разбором решений.
Чтобы вам удобнее было сначала попробовать решить задачки самим, мы скрыли правильные ответы под спойлером. Чур, открывать только после того, как сами додумались до решения ;-)
Поехали!
/**
* @return partition between 0 inclusive
* and partitions exclusive
*/
int partition(Track track, int partitions) {
assert track != null;
assert partitions > 0;
return track.hashCode() % partitions;
}
return Math.abs( track.hashCode() ) % partitions;
return Math.abs( track.hashCode() % partitions );
void cleanup(Path dir) throws IOException {
for (Path file : Files.newDirectoryStream(dir)) {
if (file.endsWith(".tmp")) {
Files.delete(file);
}
}
}
void cleanup(Path dir) throws IOException {
try ( DirectoryStream<Path> stream = Files.newDirectoryStream(dir) ) {
for (Path file : stream) {
if (file.endsWith(".tmp")) {
Files.delete(file);
}
}
}
}
var
, чтобы программа скомпилировалась? var list = Arrays.asList("1", 2, 3.0);
List<?>
List<? super Comparable>
List<? extends Comparable>
List<? extends Comparable & Serializable>
List<? super Comparable & Serializable>
class ConcurrencyLimiter {
static final int DEFAULT_LIMIT = 10;
final Semaphore semaphore = new Semaphore(DEFAULT_LIMIT);
void runTask(Runnable task) {
semaphore.acquireUninterruptibly();
try {
task.run();
} finally {
semaphore.release();
}
}
// Implement me
void setLimit(int newLimit) {
assert newLimit > 0;
// TODO: Implementation pending
}
}
// Implemented
final AtomicInteger limit = new AtomicInteger(DEFAULT_LIMIT);
void setLimit(int newLimit) {
assert newLimit > 0;
final int previous = limit.getAndSet(newLimit);
if (newLimit >= previous) {
semaphore.release(newLimit - previous);
} else {
semaphore.acquireUninterruptibly(previous - newLimit);
}
}
// Implemented
final AtomicInteger limit = new AtomicInteger(DEFAULT_LIMIT);
void setLimit(int newLimit) {
assert newLimit > 0;
final int previous = limit.getAndSet(newLimit);
if (newLimit >= previous) {
semaphore.release(newLimit - previous);
} else {
// magic goes here:
for ( int i = 0; i < previous - newLimit; i++)
semaphore.acquireUninterruptibly(1);
}
}
К сожалению, не доступен сервер mySQL