Problem mit Threads

  • Themenstarter Themenstarter JavaNooby
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
J

JavaNooby

Gast
Hallo,

habe ein Problem mit Threads und komme seit ca 1 Std nicht weiter:

Code:
			// start the progress bar
			Thread t1 = new Thread(new progressbarThread());
			t1.start();
			
			// zip the directory
			addTextToEncryptLogTextArea("Creating archive for encrypting...");
			Thread t2 = new Thread(new zipThread());
			t2.start();
			
			// crypt the directory
			addTextToEncryptLogTextArea("Encrypting archive...");
			Thread t3 = new Thread(new cryptThread());
			t3.start();

Wie mach ich es dort, dass thread t3 auf thread t2 wartet bis dieser fertig ist? Komme leider nicht weiter 🙁

P.S. Geht mir hauptsächlich darum dass die ausgaben addText blabla erst ankommen wenn der thread fertig ist. Ist in nem GUI log fenster und das sollte schon korrekt sein 🙂
 
schaue dir die Operation Thread.join() an,

alternativ lasse das ZipThread-Objekt (Klassen groß schreiben!) einfach eine Operation ready() oder so anbieten, die irgendwann korrekt true gibt,
CryptThread ruft ab und zu diese Operation

alternativ verwende ein Synchronisationsobjekt mit wait/ notify,
da lies dann aber besser erstmal ein Kapitel zu Threads in einem Lehrbuch..

http://www.galileocomputing.de/openbook/javainsel6/
 
Hallo,

das mit dem Thread.join() habe ich auch schon versucht. Verstehe es allerdings nicht, das openbook sagt mir dazu leider nicht wirklich etwas genaues 🙁

Das mit dem boolean ready war gute idee, allerdings hapert es an der umsetzung.. "cannot make a static reference".. okay, mach ich ein static draus.. "please remove static from".. okay, dann ebend nicht 😀
 
was gibt es denn an
Code:
package com.javatutor.insel.thread; 
 
class JoinTheThread 
{ 
  static class JoinerThread extends Thread 
  { 
    public int result; 
 
    @Override public void run() 
    { 
      result = 1; 
    } 
  } 
 
  public static void main( String[] args ) throws InterruptedException 
  { 
    JoinerThread t = new JoinerThread(); 
    t.start(); 
//    t.join(); 
    System.out.println( t.result ); 
  } 
}
http://www.galileocomputing.de/open...09_004.htm#mjdd6a64976ce2671dcd8f72a09df8e78e

nicht zu verstehen?

der main-Thread wartet mit join auf einen anderen,
genauso könntest du es machen (es ist natürlich wichtig, wer wen wann aufruft)

-------

bei der ready-Idee ist es wichtig, 'static' nirgendwo zu verwenden 😉


stelle genauere Fragen/ mehr Code, dann kann man mehr verraten
 
Hallo,

okay, .join geht nun aber kann ich nicht verwenden da ich dann wieder meine gui blockiert bekomme.. genau deswegen habe ich ja threads gewählt 😉.

Beispiel:

Code:
			if (CryptThread.ready)
			{
				addTextToEncryptLogTextArea("Done!");
			}

Bekomm ich: Cannot make a static reference to the non-static field CryptThread.ready

Code:
	public class CryptThread extends Thread
	{
		public boolean ready;
		
		public void run() 
		{
			try
			{
				Crypt.encryptFile(outputFileTextField.getText(), outputFileTextField.getText() + ".enc", "12345678");
				ready = true;
			}
			catch (Exception e)
			{
				addTextToEncryptLogTextArea(e.toString());
			}
		}
	}

Hier noch Crypt:

Code:
public class Crypt
{
	public static void encryptFile(String input, String output, String pwd) throws Exception
	{
		CipherOutputStream out;
		InputStream in;
		Cipher cipher;
		SecretKey key;
		byte[] byteBuffer;   
		
		// set encrypt algorithm
		cipher = Cipher.getInstance("DES");
		// turn in the password
		key = new SecretKeySpec(pwd.getBytes(), "DES");
		// initiate the encrypting
		cipher.init(Cipher.ENCRYPT_MODE, key);
		
		in = new FileInputStream(input);
		out = new CipherOutputStream(new FileOutputStream(output), cipher);
		
		byteBuffer = new byte[1024];
		
		for (int n; (n = in.read(byteBuffer)) != -1; out.write(byteBuffer, 0, n));
		
		// close file handles
		in.close();
		out.close();
	   }
}

Noch etwas benötigt, sorry, aber ich bin in dem Bereich recht neu 🙁
 
> okay, .join geht nun aber kann ich nicht verwenden da ich dann wieder meine gui blockiert bekomme.. genau deswegen habe ich ja threads gewählt

wie gesagt: bedenke, wer auf wen warten soll,

nämlich ein Thread auf den anderen, dann kann die GUI gar nicht lahmgelegt werden,

wenn du im Moment den GUI-Thread anhälst dann ist die einfache Lösung: tue dies nicht,
nur die Threads sollen untereinander warten,
z.B. in der run-Operation des einen .join() des anderen aufrufen,

das funktioniert natürlich nur, wenn man eine Referenz auf dieses andere Thread-Objekt hat,


genauso bei ready,
> if (CryptThread.ready)
ist Käse,

if (cryptThreadObject.ready)
muss das heißen,
cryptThreadObject ist das t2-Objekt vom Anfang?,

damit t3 t2 kennt, muss t3 natürlich diese Referenz irgendwie bekommen, z.B. in Konstruktor als Parameter übergeben und dann intern als Exemplarvariable speichern
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben