Threads

3 respostas
monike

Bom dia Galera, gostaria mt que me ajudassem pois já tentei de tudo.
Tenho uma aplicação onde tenho dois botoes, importar e cancelar o envio do arquivo.
Estou usando thread depois que coloco ela no sleep , estou levando uma exception java.lang.IllegalThreadStateException: Thread is already started pois diz q já esta startada e nao posso ficar tentando fazer isso novamente.
Gostaria de saber como faço para que seja verificado a Thread em execução e de que modo resolvo as 4 possibilidades abaixo.Pq toda vez que eu clico no botão importar ele sempre chama o método run();
Obrigada!!!

botaoImportar.addActionListener(new java.awt.event.ActionListener() {
	          public void actionPerformed(java.awt.event.ActionEvent e) {
				    EventQueue.invokeLater(new Runnable() {
	      			public  void run() {
	      				//Verificando se existe conteudo para importacao
	      				if(jTextFieldNomeArquivo.getText().equals("") || jTextFieldNomeArquivo.getText().equals(null)){
							 JOptionPane.showMessageDialog(null, "Selecionar arquivo para importação", "Arquivo", JOptionPane.WARNING_MESSAGE);
							 
						//Verifica se thread foi interrompida depois da importacao ter sido cancelada	 
						}else if(thread.isAlive() == true){							
							 thread.resume();
							 //thread.currentThread() 
							 //thread.join();
						
					   //importando pela primeira vez	
						}else{
	      						progressBar = new JProgressBar();
		      					progressBar.setStringPainted(true);
		      					painelPrincipal.add(progressBar);
		      					painelPrincipal.add(botaoCancelar);
		      					thread.start();
						}
	      				//importando  pela segunda vez sem cancelar
	      			}
	      		});
	        	  
	          }
	        });         
	
	
        botaoCancelar.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent e) {
	        	  	    
	        	    int response = JOptionPane.showConfirmDialog(null, "Deseja cancelar a importação", "Confirmação",
	        	        JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
	        	 if (response == JOptionPane.YES_OPTION) {  	        	    		        	    	 
	        	    	    progressBar.setVisible(false);
	        	    	 JOptionPane.showMessageDialog(null, "Processo Cancelado", "Cancelamento", JOptionPane.WARNING_MESSAGE);
						 thread.suspend();
						 botaoCancelar.setEnabled(false);
						
	        	    } 	 
	          }
	        });         

private class ProgressRunnable implements Runnable {
		public void run() {
			try {
				progressBar.setMinimum(0);	
	    		progressBar.setMaximum(100);	
	    		value = progressBar.getMinimum();
				while (value <= progressBar.getMaximum()) {
					EventQueue.invokeLater(new Runnable() {
						public void run() {
							progressBar.setValue(value++);	//atualiza o valor da barra
						}
					});
					Thread.sleep(50);
					
				}
			} catch (InterruptedException ex){
				ex.printStackTrace();
				JOptionPane.showMessageDialog(null, ex.getMessage(), "Erro", JOptionPane.ERROR);
			}	
			 JOptionPane.showMessageDialog(null, "Processo concluído com sucesso!", "Importação", JOptionPane.INFORMATION_MESSAGE);
			 botaoCancelar.setEnabled(false);
		}
		
	}

3 Respostas

E

Thread.suspend e Thread.resume não devem ser usadas. O correto é você criar uma nova thread em vez de reaproveitar a mesma, ou então usar um java.util.concurrent.Executor, que lida com esses problemas de reaproveitar threads corretamente.

monike

Obrigada pela resposta!!!
mas imagina que num periodo de 30 minutos o cara queira enviar 10 arquivos vou pra cada vez que ele importar terei que criar uma nova thread???
Como poderia ser resolvido ???

E

Criar uma nova thread é um processo um pouco caro, como você mesmo disse. Você pode usar o conceito de Executor do pacote java.util.concurrent para usar threads de um pool de threads, para reaproveitar threads.

Criado 26 de outubro de 2010
Ultima resposta 26 de out. de 2010
Respostas 3
Participantes 2