a mudanca entre uma thread e outra e feita de forma tao rapida que para o utilizador isso esta acontecendo paralelamente. Em hardwares com multiplos CPUs ou multi-cores, as threads sao realizadas realmente de forma simultanea;Os sistemas que suportam apenas uma unica thread (em real execucao) sao chamados de monothread enquanto que os sistemas que suportam multiplas threads sao chamados de multithread.O objetivo de toda equipe de desenvolvimento e produzir programas que executem uma serie de tarefas logicamente organizadas. Na maioria dos casos e isso mesmo, simples assim....um sistema programado para executar uma monte de tarefas sequencias e cronologicamente estipulada. Por uma outra perspectiva, o sistema somente executara uma tarefa por vez. A questao surge quando e identificado que em algumas partes de alguns programas, existem certos processos que nao necessitam ser executados sequencialmente, ou seja, nao faz sentido para aquele escopo em especial que uma tarefa espere uma outra ser terminada para que a mesma possa ser executada. Podemos pegar o exemplo classico de um editor de texto nao faz sentido que o usuario deva esperar o arquivo de 100 paginas ser impresso para depois salva-lo. Na verdade, o programa deveria permitir que o usuario pudesse fazer estas duas tarefas ao mesmo tempo. Com isso vemos que podemos ter 2 tipos de aplicacao:Monothread que executa tarefas sequencias.Multithread que executa tarefas paralelas, ao mesmo tempo e concorrentemente.E por isso que dizemos a tecnologia java e multithread....isso quer dizer que com ela podemos criar programas que executem inumeras tarefas concorrentemente. O autor do programa java esta livre para criar e delimitar quantos processos sequencias e concorrentes poderao acontecer dentro do sistema. Esta magica acontece simplesmente com a utilizacao da interface Runnable e a classe Thread. Que legal, que lindo..maravilhoso ? Nao..nada de lindo e maravilhoso !! A possibilidade de fazer aplicacoes multithread resulta em uma situacao aonde muitos problemas podem surgir. Vejamos os comuns:Acesso ConcorrenteSe vc para e pensar que um programa pode executar inumeras tarefas ao mesmo tempo, chegara a conclusao que podera acontecer situacoes aonde dois ou mais processos poderao manipular os mesmos recursos causando o problema chamado de acesso concorrente. Eu sempre costumo dizer a POO nada mais e que o reflexo das coisas que acontece no mundo real e isso nao e diferente para a questao do acesso concorrente. Imagine a situacao aonde um pai tente gerenciar que os seus dois filhos brinquem com seu brinquedos. Do ponto de vista funcional a coisa e simples, ou o pai bloqueia uma crianca enquanto a outra brinca com o brinquedo ou ele compra um brinquedo para cada crianca, fazendo com que elas possam brincar ao mesmo tempo.Por causa desta situacao e que encontramos o controle de bloqueio e o modificador chamado synchronized na tecnologia java. Com ele, o desenvolvedor tem a capacidade de bloquear um objeto, impedindo que o mesmo seje usando por um outro(s) processo(s) que porventura tente acessa-lo. Veja o oposto e verdadeiro,... a ausencia do operador faz que com o objeto possar ser utilizado concorrentemente, ficando entao a cargo do desenvolvedor identificar os casos e decidir oque fazer.