O exemplo da impressão da lista "caseira" me deixou um pouco confuso sobre threads. Eu entendia que quem executa "wait" e "notify" são as próprias threads e não os objetos que elas utilizam. Não entendi bem por que utilizamos
synchronized (lista) {
lista.wait();
}
Ao invés de
synchronized (this) {
this.wait();
}
na thread que executa a TarefaImprimir.