ele não compila certo...
se eu tirar o synchronized ele não processa na ordem correta
obs.: eu li vários tópicos e mesmo assim não consegui resolver...
importjavax.swing.*;publicclassPrincipal{publicsynchronizedvoidmeuMetodo(){}publicstaticvoidmain(String[]args){intpergunta;pergunta=Integer.parseInt(JOptionPane.showInputDialog("Qual X pretende fazer: \n"+"1- X Burg\n"+"2- X Salada\n"+"3- X Bacon\n"+"4- X Egg\n"+"5- X Frango"));if(pergunta==1){Stringlock=null;System.out.println("Iniciando X Burg");synchronized(lock){newThread(newcarne()).start();newThread(newpao()).start();newThread(newqueijo()).start();newThread(newretirarCarne()).start();newThread(newmaionese()).start();}}
Você tem de usar “join”, não “synchronized”, para esperar uma thread acabar e iniciar a próxima.
Você não precisa usar nenhum “synchronized” nesse exemplo - acho que o problema que seu professor “pedio” está mal-formulado, já que normalmente eles pedem coisas mais úteis que sequenciar threads (nesse caso, você não precisa de threads).
Algo como:
ThreadthreadCarne=newThread(newcarne());threadCarne.start();// põe a carne...threadCarne.join();// e espera a carne ser postaThreadthreadPao=newThread(newpao());threadPao.start();threadPao.join();
Note que não é “wait” nem “sleep”. O nome “wait” não quer dizer “esperar” no sentido que você quer, mas é muito específico para usar com “notify”.
M
Musquitolm
Deu certo vlu…
porém vou ver agora se o professor vai aceitar desta forma (sem ser pelo synchronized)…
por isto ainda não vou fechar o tópico
E
entanglement
Acho que seu professor quer que simule o join, usando “wait” e “notify”.
Eu em particular acho que usar “wait” e “notify” é igual a usar “goto”, ou seja, deveria ser proibido e apenas permitido para quem tivesse doutorado em ciências da computação.
E
entanglement
Bom, eu não tenho doutorado em ciências da computação, portanto acho que eu não deveria estar usando wait e notify. Mas fica um exemplo para você ver como é que se usa o tal do synchronized (que acho que é muito complicado usar no seu caso em particular).
classTesteSequenciamentoThreads{privateThreadcriarThread(finalStringmensagem,finalObjectlock){Threadthr=newThread(newRunnable(){@Overridepublicvoidrun(){System.out.println(mensagem);synchronized(lock){lock.notify();}}});returnthr;}publicvoidteste(){Threadt1,t2,t3,t4;Objectlock=newObject();// note que synchronized não deixa você usar "null"t4=criarThread("linha 4",lock);t3=criarThread("linha 3",lock);t2=criarThread("linha 2",lock);t1=criarThread("linha 1",lock);try{synchronized(lock){t1.start();lock.wait();t2.start();lock.wait();t3.start();lock.wait();t4.start();lock.wait();}}catch(InterruptedExceptionex){ex.printStackTrace();}}publicstaticvoidmain(String[]args){TesteSequenciamentoThreadst=newTesteSequenciamentoThreads();t.teste();}}
M
Musquitolm
vlu ai pelo adicional…
o professor aceito o primeiro…
vlu pessoal
rmendes08
entanglement:
Acho que seu professor quer que simule o join, usando “wait” e “notify”.
Eu em particular acho que usar “wait” e “notify” é igual a usar “goto”, ou seja, deveria ser proibido e apenas permitido para quem tivesse doutorado em ciências da computação.
Nem tanto, usar wait() e notify() é o básico do básico de programação concorrrente. Porém eu concordo que é mais interessante usar a API de coleções concorrentes e pools de threads antes de sincronizar algo na mão.
Enfim, o pessoal não aprende PC justamente por causa de exemplos toscos com esse.