Например:
public class TestHashMap {
public static void main(String[] args) {
HashMap map = new HashMap(){
{
put("1", "ONE");
}{
put("2", "TWO");
}{
put("3", "THREE");
}
};
Set keySet = map.keySet();
for (String string : keySet) {
System.out.println(string+" ->"+map.get(string));
}
}
}
Как это работает
Первая скобка создает новый анонимный внутренний класс. Эти внутренние классы способны получить доступ к поведению своего родительского класса. Итак, в нашем случае мы фактически создаем подкласс класса HashSet, поэтому этот внутренний класс способен использовать метод add ().
И Второй набор фигурных скобок - это ничего, кроме инициализаторов экземпляров. Если вы напомните основные концепции Java, вы можете легко связать блоки инициализатора экземпляра со статическими инициализаторами из-за аналогичной структуры, подобной структуре. Единственное отличие состоит в том, что статический инициализатор добавляется с ключевым словом static и запускается только один раз; независимо от того, сколько объектов вы создаете.
Я не протестировал это, но как насчет
print `(touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;) &`;
, средние круглые скобки выполняются в подоболочке, но это не должно причинять боль.
Попытайтесь поместить команды в фигурные скобки с & s, как это:
{command1 & ; command2 & ; command3 & ; }
Это не создает подоболочку, но выполняет группу команд в фоновом режиме.
HTH
for command in $commands
do
"$command" &
done
wait
амперсанд в конце команды работает, это в фоновом режиме, и эти wait
ожидает, пока фоновая задача не выполнена.
Hugh спасибо, который сделал это:
adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped")
started
stopped
adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped") &
started
[1] 7101
adrianp@frost:~$ stopped
[1]+ Done ( echo "started"; sleep 15; echo "stopped" )
adrianp@frost:~$
другие идеи не работают, потому что они запускают каждую команду в фоновом режиме, и не последовательность команды (который важен в моем случае!).
Еще раз спасибо!
Я не знаю, почему никто не ответил с надлежащим решением:
my @children;
for (...) {
...
my $child = fork;
exec "touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;" if $child == 0;
push @children, $child;
}
# and if you want to wait for them to finish,
waitpid($_) for @children;
Это заставляет Perl порождать детей для выполнения каждой команды и позволяет Вам ожидать всех детей для завершения перед продолжением.
Между прочим,
print `some command`
и
system "some command"
произведите то же содержание к stdout, но первое имеет более высокие издержки, поскольку Perl должен получить весь из"some command
"вывод
Можно передать параметры оперативной группе штаба (имеющий последовательные команды) и выполнить их в фоне.
for hrNum in {00..11};
do
oneHour=$((10#$hrNum + 0))
secondHour=$((10#$hrNum + 12))
{ echo "$oneHour"; echo "$secondHour"; } &
wait
done
GavinCattell подошел ближе всех (для bash, IMO), но, как указал Mad_Ady, он не будет обрабатывать файлы «блокировки». Это должно:
Если есть другие ожидающие задания, wait также будет ожидать их. Если вам нужно дождаться только копий, вы можете накапливать эти PID и ждать только их. Если нет, вы можете удалить 3 строки с «pid», но это более общий вариант.
Кроме того, я добавил проверку, чтобы полностью избежать копирования:
pids=
for file in bigfile*
do
# Skip if file is not newer...
targ=/destination/$(basename "${file}")
[ "$targ" -nt "$file" ] && continue
# Use a lock file: ".fileN.lock" for each "bigfileN"
lock=".${file##*/big}.lock"
( touch $lock; cp "$file" "$targ"; rm $lock ) &
pids="$pids $!"
done
wait $pids
Кстати, похоже, что вы копируете новые файлы на FTP репозиторий (или аналогичный). Если это так, вы можете рассмотреть стратегию копирования / переименования вместо файлов блокировки (но это уже другая тема).