Concorrência, I/O e Swing

Coordenar threads, ler e escrever dados e responder a eventos numa interface Java.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Threads e estado partilhado

  • Threads do mesmo processo partilham objetos, cada uma com a sua pilha. Concorrência é sobreposição possível, não paralelismo garantido.
  • start() executa run() noutra thread; chamar run() é uma chamada normal. join() espera o fim; sleep() não sincroniza nada.
  • contador++ lê, soma e escreve: duas threads podem ler 0 e escrever 1, perdendo um incremento.
  • synchronized exclui só pelo mesmo monitor e publica alterações entre libertar e adquirir. Método de instância usa this, estático usa o Class; dois objetos não partilham lock.
  • volatile publica leituras e escritas, sem tornar ++ atómico. Para um contador isolado, AtomicInteger.incrementAndGet().

Espera e notificação

Espera sob o monitor que protege a condição:

synchronized int retirar() throws InterruptedException {
    while (valor == null) wait();
    int resultado = valor;
    valor = null;
    notifyAll();
    return resultado;
}
  • wait() liberta o monitor e suspende; ao acordar, readquire-o. Outra thread pode agir primeiro, por isso o while volta a testar. Há também despertares sem notificação.
  • notifyAll() acorda interessados sem libertar o monitor nem reservar o valor. Dois consumidores para um valor: o segundo volta a esperar; com if, leria null.
  • Para este padrão pronto, prefere uma BlockingQueue.
  • interrupt() pede, não força. Sem propagar InterruptedException, repõe o sinal e termina de forma coerente. Vários locks adquirem-se sempre pela mesma ordem; secções curtas, sem I/O dentro.

Bytes, texto e fecho

TipoTrata
InputStream / OutputStreamBytes.
Reader / WriterTexto.
InputStreamReaderBytes para texto, com codificação explícita.
BufferedReaderBuffer e leitura por linhas.

readLine() dá null no fim; linha vazia é string. DataInputStream lê formato binário, não texto decimal. try-with-resources fecha mesmo com exceção; fechar o exterior fecha os envolvidos. Recurso em JAR lê-se com getResourceAsStream, verificando null.

Swing e EDT

A Event Dispatch Thread trata eventos e redesenho. Listener demorado congela a interface.

MomentoOndeTarefa
ListenerEDTCria o worker, execute(), termina.
doInBackground()WorkerI/O ou cálculo, sem tocar em Swing.
done()EDTget(), trata falha, atualiza componentes.

get() no listener bloqueia de novo; invokeLater sozinho só adia. Layout managers posicionam; desenho próprio redefine paintComponent com super.paintComponent(g), a partir do estado, com repaint(). getGraphics() não persiste entre redesenhos.

Exemplos de threads, I/O e Swing.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.