Rodar Duas threads em ordem [RESOLVIDO]

1 resposta
HellChoicer

Não sou muito bom com threads pois comecei a usar elas a pouco tempo então se puderem ajudar, preciso rodar duas threads uma logo apos acabar a outra mas se eu usar método wait(); acaba dando erro ou rodando apenas a primeira e dando erro;

Aqui o código na do JDialog onde mando rodar as threads.

package CnToDB;

import java.awt.BorderLayout;

public class Importação extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	public static JTextArea impressao;
	static Calendar c;
	static Date fimPes;
	static Date fimVei;
	static Date Final;

	// Launch the application.
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				try {
					Importação dialog = new Importação();
					dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
					dialog.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	// Create the dialog.
	public Importação() {
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowOpened(WindowEvent arg0) {
				try {
					// Threads para importação
					Thread pessoa = new ImportPessoa();
					Thread veiculo = new ImportVeiculo();

					c = Calendar.getInstance();

					long ini = System.currentTimeMillis();

					// dispara a thread
					pessoa.start();

					// escreve o tempo de execução
					long fimPessoa = System.currentTimeMillis();
					fimPes = c.getTime();

					Functions.escreveTempo(fimPes, ini, fimPessoa, "PARA PESSOA");

					synchronized (pessoa) {
						try {
							pessoa.wait();
						} catch (InterruptedException ie) {
							ie.printStackTrace();
						}
						
					}

					// dispara a thread
					veiculo.start();

					// escreve o tempo de execução
					long fimVeiculo = System.currentTimeMillis();
					fimVei = c.getTime();

					Functions.escreveTempo(fimVei, ini, fimVeiculo, "PARA VEICULO");

					synchronized (veiculo) {
						try {
							veiculo.wait();
						} catch (InterruptedException ie) {
							ie.printStackTrace();
						}
					}

					// escreve o tempo de execução total
					long fim = System.currentTimeMillis();
					Final = c.getTime();

					Functions.escreveTempo(Final, ini, fim, "");

					synchronized (pessoa) {
						pessoa.notify();
					}
					synchronized (veiculo) {
						veiculo.notify();
					}

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		setTitle("Importa\u00E7\u00E3o de Registros");
		setResizable(false);
		setModal(true);
		setBounds(100, 100, 500, 390);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);

		contentPanel.setLayout(null);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 11, 474, 339);
		contentPanel.add(scrollPane);

		impressao = new JTextArea();
		scrollPane.setViewportView(impressao);
	}
}

alguém poderia me ajudar??
Hora q rodo o programa ele da esse erro

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.Util.getInstance(Util.java:381)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:985)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1113)
	at com.mysql.jdbc.ConnectionImpl.createStatement(ConnectionImpl.java:2381)
	at com.mysql.jdbc.ConnectionImpl.createStatement(ConnectionImpl.java:2363)
	at CnToDB.ImportVeiculo.run(ImportVeiculo.java:65)

Ou roda apenas a primeira e da esse erro

java.lang.IllegalMonitorStateException
	at java.lang.Object.wait(Native Method)
	at java.lang.Object.wait(Object.java:503)
	at CnToDB.Importação$2.windowOpened(Importação.java:68)
	at java.awt.AWTEventMulticaster.windowOpened(Unknown Source)
	at java.awt.Window.processWindowEvent(Unknown Source)
	at javax.swing.JDialog.processWindowEvent(Unknown Source)
	at java.awt.Window.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$300(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.WaitDispatchSupport$2.run(Unknown Source)
	at java.awt.WaitDispatchSupport$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.awt.WaitDispatchSupport.enter(Unknown Source)
	at java.awt.Dialog.show(Unknown Source)
	at java.awt.Component.show(Unknown Source)
	at java.awt.Component.setVisible(Unknown Source)
	at java.awt.Window.setVisible(Unknown Source)
	at java.awt.Dialog.setVisible(Unknown Source)
	at CnToDB.Importação$1.run(Importação.java:35)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$300(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Qualquer sugestão é bem vinda.
Só pra constar: vou adicionar mais dessas threads depois e vou precisar que elas executem em sequencia.

1 Resposta

HellChoicer

Consegui resolver, deixei as classe de threads que eu ia rodar cada uma como uma Thread como classe comum com main e ai criei uma Thread que roda essas classe na ordem que eu colocar la.

package CnToDB;

import java.util.Calendar;
import java.util.Date;

import Functions.Functions;

public class RodaImport extends Thread {

	static Calendar c;
	static Date Inicio;
	static Date Final;

	@Override
	public void run() {
		try {

			c = Calendar.getInstance();

			Inicio = c.getTime();
			LogMiddler.escreve(Inicio + "  INICIANDO... " + "\n" + "\n");

			LogMiddler.escreve(
					"------------------------------------------------------------------------------------------------"
							+ "\n" + "\n");

			long ini = System.currentTimeMillis();

			new ImportPessoa();
			ImportPessoa.main(null);

			new ImportVeiculo();
			ImportVeiculo.main(null);

			new ImportProduto();
			ImportProduto.main(null);

			// escreve o tempo de execução total
			long fim = System.currentTimeMillis();
			Final = c.getTime();

			LogMiddler.escreve(Final + "  FINALIZADO!" + "\n" + "\n");
			Functions.escreveTempo(Final, ini, fim, "");
			LogMiddler.escreve(
					"------------------------------------------------------------------------------------------------"
							+ "\n" + "\n");

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

E mandei rodar assim.

package CnToDB;

import java.awt.BorderLayout;

public class Importação extends JDialog {

	private static final long serialVersionUID = 1L;
	private final JPanel contentPanel = new JPanel();
	public static JTextArea impressao;

	// Launch the application.
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				try {
					Importação dialog = new Importação();
					dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
					dialog.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	// Create the dialog.
	public Importação() {
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowOpened(WindowEvent arg0) {
				try {
					// Threads para importação
					Thread importa = new RodaImport();

					importa.start();

				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		setTitle("Importa\u00E7\u00E3o de Registros");
		setResizable(false);
		setModal(true);
		setBounds(100, 100, 500, 390);
		getContentPane().setLayout(new BorderLayout());
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		getContentPane().add(contentPanel, BorderLayout.CENTER);

		contentPanel.setLayout(null);

		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(10, 11, 474, 339);
		contentPanel.add(scrollPane);

		impressao = new JTextArea();
		scrollPane.setViewportView(impressao);
	}
}
Criado 20 de outubro de 2015
Ultima resposta 22 de out. de 2015
Respostas 1
Participantes 1