Hilfe bei MultiThreading; Einige Fragen.

progsfa

Mitglied
Guten Tag Ihr Java-Programmierer.
Ich habe die schon sehr alte Cäsarverschlüsselung in Java realisiert und wollte diese nun auch multi-core-fähig schreiben.
Dazu nutze ich Threads, die für mich noch relativ neu sind.

Die Cäsarverschlüsselung besteht darin, das ein Buchstabe um den Schlüssel (Position des Schlüsselbuchstaben im Alphabet) verschoben wird.

Wie ich schon sagte, sagte hab ich wenig Erfahrung mit Threads und Java.

1. Frage: Ich möchte 4 Threads erstellen, die sich den gesamten String "reinteilen".
Alle Threads nutzen dieselbe run()-Methode und ich wollte fragen, gibt es eine schönere Löung als die if-Bedingungen mit den Booleans ? s. Code

2. Ich würde gerne in der Methode start_encode(...,..) als return den von den Threads berechneten zusammengesetzten String zurückgeben. (
Java:
 return st1+st2+st3+st4;
) .
Da diese Threads dort noch rechnen, wird der nicht veränderte String zurückgegeben.
Wie kann ich da eine Warte-Bedingung einfügen, die nur gestartet wird, wenn alle 4 Threads benndet sind?
Die Lösung mit den 5ten Warte-Thread ist glaube ich auch nicht so schön ^^.

3. So, wie es jetzte fast funktioniert, wird jedesmal, wenn man auf "Verschlüsseln" drückt, verschiedene Srtings zurückgegeben, obwohl es ja praktisch nur 1ne "richtige" Verschlüsselung gibt.
Vlt findet jemand (meinen Logik)-Fehler.

Ich habe 2 Klassen (main & caesar)

main:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;


public class main implements WindowListener, ActionListener {

	private 
		JFrame f;
		JButton encode,decode;
		JTextArea text,text2;
		JTextField schluessel;
		caesar c;
		JLabel l,l1,l2;
	public static void main(String[] args) {
		main m = new main();
		m.init();
	}

	public void init() {
		c = new caesar();
		f= new JFrame("Caesar-Verschlüsselung");
		encode=new JButton("Verschlüsseln");
		decode=new JButton("Entschlüsseln");
		text=new JTextArea("Hier Klartext/Code eingeben");
		text2=new JTextArea("Hier wird der Code/Klartext ausgegeben");
		schluessel=new JTextField("Key");
		l = new JLabel("Zeichen: ");
		l1 = new JLabel("Zeit: ");
		l2 = new JLabel("Perf: ");
		JScrollPane sp = new JScrollPane(text);
		JScrollPane sp2 = new JScrollPane(text2);
		sp.setBounds(5, 5, 475, 200);
		sp2.setBounds(5,235 , 475, 200);
		l.setBounds(5,435 , 100, 20);
		l1.setBounds(110,435 , 100, 20);
		l2.setBounds(235,435 , 150, 20);
		sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		sp2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		sp2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		schluessel.setBounds(5, 210, 40, 20);
		encode.setBounds(50, 210, 210, 20);
		decode.setBounds(270, 210, 210, 20);
		encode.addActionListener(this);
		decode.addActionListener(this);
		f.add(sp);
		f.add(sp2);
		f.add(encode);
		f.add(l);
		f.add(l1);
		f.add(l2);
		f.add(decode);
		f.add(schluessel);
		f.addWindowListener(this);
		f.setLayout(null);
		f.setResizable(false);
		f.pack();
		f.setSize(490,500);
		f.setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		Object q = arg0.getSource();
		char[] enc;
		enc =  schluessel.getText().toCharArray();
		String s = text.getText();
		if(q==encode) {
			//thread t = new thread();
			l.setText("Zeichenr: "+c.count_chars(s));
			String code= c.start_encode(s,enc[0]);
			l1.setText("Zeit "+c.dif_time());
			l2.setText("Perf.: "+ c.char_sec(s));
			text2.setText(code);
		} else if(q==decode){
			l.setText("Zeichenr: "+c.count_chars(s));
			String code =c.decode(s,enc[0]);
			l1.setText("Zeit "+c.dif_time());
			l2.setText("Perf.: "+ c.char_sec(s));
			text2.setText(code);
		}
	}
	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO Auto-generated method stub
		f.dispose();
		System.gc();
		System.exit(0);
	}
	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowOpened(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	
}

Caesar
Java:
import java.util.concurrent.CyclicBarrier;


public class caesar extends Thread implements Runnable {

	protected
	char[] alphabet;
	long start_millis;
	Thread t1,t2,t3,t4,t5;
	String s,st1,st2,st3,st4;
	char key;
	boolean b1,b2,b3,b4,b5;
	CyclicBarrier barrier;
	
	public caesar() {
		alphabet = new char[] {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
		start_millis=0;
		
	}
	public String start_encode(String st, char k) {
		key='g';
		s=st;
		int l =(int) st.length()/4;
		st1=s.substring(0,l);
		st2=s.substring(l,l+l);
		st3=s.substring(l+l,l+l+l);
		st4=s.substring(l+l+l,s.length());
		debug(st1);
		debug(st2);
		debug(st3);
		debug(st4);
		t1= new Thread(this );
		t2= new Thread( this );
		t3= new Thread( this );
		t4= new Thread( this );
		t5= new Thread(this); 
		t1.start();
		b1=true;
		t2.start();
		b2=true;
		t3.start();
		b3=true;
		t4.start();
		b4=true;
		t5.start();
		b5=true;
		return "";
		
	}
	public String  encode(String s, char key) {
		String sneu = "";
		char[] schars;
		schars = s.toCharArray();
		int shl = indexOf(alphabet,key);
		if(shl!=-1) {
			start_time();
			for(int i = 0; i<=schars.length-1;i++) {
				int ckey = indexOf(alphabet,schars[i]);
				if(ckey!= -1) {
					if((shl+ckey) < alphabet.length-1) {
						sneu+=Character.toUpperCase(alphabet[(shl+ckey)]);
					} else {
						sneu+=Character.toUpperCase(alphabet[(shl+ckey)-alphabet.length+1]);
					}
				} else {
					sneu += schars[i];
				}
			}
			return sneu;
		} else {
			return "";
		}
	}
	public String decode(String s, char key) {
		String sneu = "";
		char[] schars;
		schars = s.toCharArray();
		int shl = indexOf(alphabet,key);
		if(shl!=-1) {
			start_time();
			for(int i = 0; i<=schars.length-1;i++) {
				int ckey = indexOf(alphabet,schars[i]);
				if(ckey!= -1) {
					if((ckey-shl)> 0) {
						sneu+= Character.toLowerCase(alphabet[(ckey-shl)]);
					} else if((ckey-shl < 0)) {
						sneu+=Character.toLowerCase(alphabet[alphabet.length+ckey-shl]);
					} else {
						sneu+=Character.toLowerCase(alphabet[0]);
					}
				}else {
					sneu += schars[i];
				}
			}
			return sneu;
		} else {
			return "";
		}
	}
	
	public int indexOf(char[] chr , char ch) {
		try {
			for(int i=0;i<=chr.length;i++) {
				if(Character.toUpperCase(ch)==chr[i]) { //hier dann weitermache
					return i;
				}
			}
			return -1;
		} catch(ArrayIndexOutOfBoundsException e) {
			return -1;
		}
	}
	public int count_chars(String s) {
		return s.length();
	}
	public void start_time() {
		start_millis = System.currentTimeMillis();
	}
	public String dif_time() {
		long dif = System.currentTimeMillis()-start_millis;
		double tmpsec =(double) dif/1000;
		return Double.toString(tmpsec)+"sec";
	}
	public String char_sec(String s) {
		return Integer.toString((int)((double)s.length()/(((double) System.currentTimeMillis()-start_millis)/1000)))+" Zeichen/sec";
	}
	//temp
	public void debug(String s) {
		System.out.println(s);
	}
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		if(b1) {
			st1=encode(st1,key);
			t1.stop();
			//t1=null;
		}
		if(b2) {
			st2=encode(st2,key);
			t2.stop();
			//t2=null;
		}
		if(b3) {
			st3=encode(st3,key);
			t3.stop();
			//t3=null;
		}
		if(b4) {
			st4=encode(st4,key);
			t4.stop();
			//t4=null;
		}
		if(b5) {
			while(true) {
				if(t1.isAlive() && t2.isAlive() && t3.isAlive() && t4.isAlive()) {
					try {
						t5.sleep(100);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				} else {
					debug(st1+st2+st3+st3);
					break;
				}
			}
			t5.stop();
			//t4=null;
		}
	}
}

Ich hoffe, ihr könnt mir weiterhelfen und einen schönen Rutsch wünsche ich euch.
Viele Grüße
Progsfa
 

XHelp

Top Contributor
Ohne jetzt den ganzen Code durchzugucken: schau dir "Callable" an, das könnte deinen Anforderungen entsprechen.
Willst du mal auf die schnelle die Sammlung der Shakespeare-Texte verschlüsseln? Wenn nicht, dann lohnt sich Multithreading hier gar nicht. Außerdem sollte ein Thread nur das machen, was du ihm sagst:
Java:
(new DeinThread(hierEinTeilstring)).start()
. Und mit diesem Teilstring sollte der Thread auch arbeiten.
 

Marco13

Top Contributor
Guten Tag Ihr Java-Programmierer.
...
Java:
...
public class main implements WindowListener, ActionListener {

	private 
		JFrame f;
		JButton encode,decode;
		JTextArea text,text2;
		JTextField schluessel;
		caesar c;
		JLabel l,l1,l2;

...
...

OT, lass' mich raten: C++ler? :)

Die Strutkur dessen, was du gepostet hast, ist nicht sooo durchschaubar. Warum enthält "caesar" (Klassennamen groß schreiben!) nochmal 4 oder 5 Threads udn String-Stücke? Wer ist für das Bearbeiten EINES String-Stückes verantwortlich?
Man kann mit thread.join() auf Threads warten, aber das jetzt da irgendwo reinzuwursten wäre nicht die beste Lösung...
 

progsfa

Mitglied
Ohne jetzt den ganzen Code durchzugucken: schau dir "Callable" an, das könnte deinen Anforderungen entsprechen.
Willst du mal auf die schnelle die Sammlung der Shakespeare-Texte verschlüsseln? Wenn nicht, dann lohnt sich Multithreading hier gar nicht. Außerdem sollte ein Thread nur das machen, was du ihm sagst:
Java:
(new DeinThread(hierEinTeilstring)).start()
. Und mit diesem Teilstring sollte der Thread auch arbeiten.

Naja, ich scahffe auf meinen Phenom 50k Zeichen in 11 Minuten.
Außerdem wäre es eine Übung für Threading...

mit deinem Beispiel,
also müsste ich :
Java:
(new DeinThread(hierEinTeilstring)).start()
	@Override
	public void run(String s) {
		// TODO Auto-generated method stub
 //mache iwas mit dem String. ??

Wäre das so ein richtiger Ansatz?

OT, lass' mich raten: C++ler?

Die Strutkur dessen, was du gepostet hast, ist nicht sooo durchschaubar. Warum enthält "caesar" (Klassennamen groß schreiben!) nochmal 4 oder 5 Threads udn String-Stücke? Wer ist für das Bearbeiten EINES String-Stückes verantwortlich?
Man kann mit thread.join() auf Threads warten, aber das jetzt da irgendwo reinzuwursten wäre nicht die beste Lösung...

hehe ^^ :)
Nein ich bin kein C++ler, nur JSler, PHPler.
Java ist meine erste OOPS (OO-programmierSprache ^^)

Naja ich dachte mir, ich schreib eine KLasse Caesar, mit der ich dann in weiteren Programmen einfach meine Caesar-Versschlüsselung durchführen kann.
Weiterhin dachte ich mir, das wenn ich die Klasse ohne Threads schreibe , dann habe ich eine seqeuntiell ablaufende Verschlüsselung => 1fache Geschwindigkeit. => höchstens 1 Core ausgelastet.
Deswegen den String in 4 Stücke teilen und mit 4 Threads parallel bearbeiten lassen, damit dann 4 Core ausgelastet werden => (?) 4fache Geschwindigkeit (?)
Und am Ende einfach alle Teile zusammenfügen und returnen.

Das mit dem Thread.join(); habe ich auch gelesen, bin aber daraus auch nicht viel schlauer geworden...

Ich frage ja auch nach (schöneren) Umsetzungen.

Würd mich freuen, wenn meine Fragen s.o. etwas (genauer) beantwortet werden. *nicht böse aufnehmen*

Danke für eure Hilfe im vorraus.
gruß
 

progsfa

Mitglied
So, hab mir jetzt folgende Lösung gebastelt:
Java:
import java.util.concurrent.CyclicBarrier;


public class caesar  {

	protected
	char[] alphabet;
	long start_millis;
	Thread t1,t2,t3,t4,t5;
	String s,st1,st2,st3,st4;
	char key;
	boolean b1,b2,b3,b4,b5;
	CyclicBarrier barrier;
	
	public caesar() {
		super();
		alphabet = new char[] {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
		start_millis=0;
		
	}
	public String start_encode(String st, char k) {
		key=k;
		s=st;
		int l =(int) st.length()/4;
		st1=s.substring(0,l);
		st2=s.substring(l,l+l);
		st3=s.substring(l+l,l+l+l);
		st4=s.substring(l+l+l,s.length());
		//debug(st1);
		//debug(st2);
		//debug(st3);
		//debug(st4);
		return allesaugeben(); 
		
	}
	public String  encode(String s, char key) {
		String sneu = "";
		char[] schars;
		schars = s.toCharArray();
		int shl = indexOf(alphabet,key);
		if(shl!=-1) {
			start_time();
			for(int i = 0; i<=schars.length-1;i++) {
				int ckey = indexOf(alphabet,schars[i]);
				if(ckey!= -1) {
					if((shl+ckey) < alphabet.length-1) {
						sneu+=Character.toUpperCase(alphabet[(shl+ckey)]);
					} else {
						sneu+=Character.toUpperCase(alphabet[(shl+ckey)-alphabet.length+1]);
					}
				} else {
					sneu += schars[i];
				}
			}
			return sneu;
		} else {
			return "";
		}
	}
	public String decode(String s, char key) {
		String sneu = "";
		char[] schars;
		schars = s.toCharArray();
		int shl = indexOf(alphabet,key);
		if(shl!=-1) {
			start_time();
			for(int i = 0; i<=schars.length-1;i++) {
				int ckey = indexOf(alphabet,schars[i]);
				if(ckey!= -1) {
					if((ckey-shl)> 0) {
						sneu+= Character.toLowerCase(alphabet[(ckey-shl)]);
					} else if((ckey-shl < 0)) {
						sneu+=Character.toLowerCase(alphabet[alphabet.length+ckey-shl]);
					} else {
						sneu+=Character.toLowerCase(alphabet[0]);
					}
				}else {
					sneu += schars[i];
				}
			}
			return sneu;
		} else {
			return "";
		}
	}
	
	public int indexOf(char[] chr , char ch) {
		try {
			for(int i=0;i<=chr.length;i++) {
				if(Character.toUpperCase(ch)==chr[i]) { //hier dann weitermache
					return i;
				}
			}
			return -1;
		} catch(ArrayIndexOutOfBoundsException e) {
			return -1;
		}
	}
	public int count_chars(String s) {
		return s.length();
	}
	public void start_time() {
		start_millis = System.currentTimeMillis();
	}
	public String dif_time() {
		long dif = System.currentTimeMillis()-start_millis;
		double tmpsec =(double) dif/1000;
		return Double.toString(tmpsec)+"sec";
	}
	public String char_sec(String s) {
		return Integer.toString((int)((double)s.length()/(((double) System.currentTimeMillis()-start_millis)/1000)))+" Zeichen/sec";
	}
	//temp
	public void debug(String s) {
		System.out.println(s);
	}
	
	class T1 extends Thread{
		
		@Override
		public void run() {
			
		st1 = encode(st1,key);
		//t1=null;
	}
		public void stoppen(){
			this.stop(); }
		public void warten(){
		try {
			this.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
		}

	class T2 extends Thread{
		
		@Override
		public void run() {
			
		st2 = encode(st2,key);
		//t1=null;
	}
		public void stoppen(){
			this.stop(); }
		public void warten(){
		try {
			this.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
		}
	class T3 extends Thread{
		
		@Override
		public void run() {
			
			st3=encode(st3,key);
		//t1=null;
	}
		public void stoppen(){
			this.stop(); }
		public void warten(){
		try {
			this.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}}
	class T4 extends Thread{
		
		@Override
		public void run() {
			
			st4=encode(st4,key);
		//t1=null;
	}
		public void stoppen(){
			this.stop(); }
		public void warten(){
		try {
			this.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}}
	public String  allesaugeben(){
		String s; 
		
		T1 Thread1 = new T1(); 
		T2 Thread2 = new T2(); 
		T3 Thread3 = new T3(); 
		T4 Thread4 = new T4(); 
		Thread1.start(); 
		Thread2.start(); 
		Thread3.start(); 
		Thread4.start(); 
		Thread1.warten(); 
		Thread2.warten(); 
		Thread3.warten(); 
		Thread4.warten(); 
		//debug(st1+st2+st3+st3);
		return st1+st2+st3+st3; 
	}
}

das mit dem redundanten Code ist nicht so schick, aber es erfüllt bis jetzt seinen Zweck (perfum das 10fache gestiegen).

Würd mich freuen, wenn ihr trotzdem vlt eine bessere Lösung posten würdet.
 

XHelp

Top Contributor
Nein ich bin kein C++ler, nur JSler, PHPler.
Java ist meine erste OOPS (OO-programmierSprache ^^)

Öhm... du hast dich noch nicht intensiv mit php beschäftigt, oder? :oops:

Zu deinen Fragen: Hast du dir schon Callable angeguckt? Ansonsten versuch doch erstmal ein Thread zu erstellen, der beim Konstruktor einen String übergeben bekommt und in der run diesen ver-/entschlüsselt.
 

progsfa

Mitglied
Öhm... du hast dich noch nicht intensiv mit php beschäftigt, oder? :oops:

Zu deinen Fragen: Hast du dir schon Callable angeguckt? Ansonsten versuch doch erstmal ein Thread zu erstellen, der beim Konstruktor einen String übergeben bekommt und in der run diesen ver-/entschlüsselt.

Naja, also PHP nicht intensiv, nur die Standardsachen.

okay,
Danke!
 

Anhänge

  • Caesar.jar
    12,7 KB · Aufrufe: 5

XHelp

Top Contributor
Dann poste lieber den Quelltext. Dann werden dir viele sagen, dass z.B. Null-Layout böse ist und, oder das:
Java:
        T1 Thread1 = new T1();
...
        T10 Thread10 = new T10();
        Thread1.setPriority(10);
...
        Thread10.setPriority(10);
        Thread1.start();
...
        Thread10.start();
        Thread5.warten();
...
        Thread10.warten();
definitiv kein guter schreibstil ist. Von der Lösung bist du also noch ein ganzes Stück entfernt.
 

progsfa

Mitglied
Dann poste lieber den Quelltext. Dann werden dir viele sagen, dass z.B. Null-Layout böse ist und, oder das:
Java:
        T1 Thread1 = new T1();
...
        T10 Thread10 = new T10();
        Thread1.setPriority(10);
...
        Thread10.setPriority(10);
        Thread1.start();
...
        Thread10.start();
        Thread5.warten();
...
        Thread10.warten();
definitiv kein guter schreibstil ist. Von der Lösung bist du also noch ein ganzes Stück entfernt.

Okay, ich poste den quelltext dann gleich.
Wie ich schon mehrmals sagte, weis ich das das NICHT die beste Lösung ist.
Deswegen frage ich ja, was eine bessere Lösung wäre.

-Du hast mir gesagt, das ich Callable nutzen soll.
Gut, aber wenn ich net genau weis, wie man es nutzt, und wie ein besserer Schreibstil aussieht, hilft das mir auch nicht viel weiter...

EDIT:
Welchen Deconpiler nutzt du?
Ich habe hier nirgends erwähnt, dass ich 10 Threads nutze... ^^ :)
Gruß
 

Anhänge

  • main.java
    3,8 KB · Aufrufe: 2
  • caesar.java
    7,7 KB · Aufrufe: 3

XHelp

Top Contributor
-Du hast mir gesagt, das ich Callable nutzen soll.
Gut, aber wenn ich net genau weis, wie man es nutzt [...] hilft das mir auch nicht viel weiter...
Google kuz vor Silvester zu sehr ausgelastet? :bahnhof: Galileo Computing :: Java ist auch eine Insel – 14.4 Der Ausführer (Executor) kommt
Auch darüber hinaus scheinst du keinen der hier genannten Tips umgesetzt zu haben (z.B. Thread mit einem Konstruktor, der einen Substring erhält)
Welchen Deconpiler nutzt du?
Ich habe hier nirgends erwähnt, dass ich 10 Threads nutze...

Uuups ;) jad
 

progsfa

Mitglied
So, ich habe es nochmal versucht, mit dem zerteilen des Strings und folgendes ist herausgekommen:
Man wählt über einen Slider die Anzahl der Threads aus und falls nicht mehr Threads als Zeichen da sind, werden diese auch genutzt.
Ich teile durch forschleifen die Teilstrings auf die Threads auf, und erhöhe damit die Geschwinigkeit erheblich.
Ich speichere alle Threads in einer Threadgroup.

Nun wollte ich gerne Pause-und Fortsetzen-Buttons hinzufügen.
Sinn: Verschlüsselungen pausieren und fortsetzen ^^.

Das Problem ist, dass man nicht mehr .stop() und .resume() nutzen soll.

Ich habe es auch schon mit .interrupt() ausprobiert, doch in allen Fällen rechnen alle Threads einfach weiter.

Kann mir bitte jemand weiterhelfen?

Mfg
Progsfa

Code:
main.java
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class main implements WindowListener, ActionListener,ChangeListener {

	private 
		JFrame f;
		JButton encode,decode,bpause,bresume;
		JTextArea text,text2;
		JTextField schluessel;
		caesar c;
		JLabel l,l1,l2,lthreads,lprioritaet;
		JSlider sb;  
		JTextField tf; 
		inner inner; 
		JComboBox cb; 
	public static void main(String[] args) {
		main m = new main();
		m.init();
	}

	public void init() {
		c = new caesar();
		f= new JFrame("Caesar-Verschlüsselung");
		
		encode=new JButton("Verschlüsseln");
		decode=new JButton("Entschlüsseln");
		bpause = new JButton("Pause");
		bpause.setEnabled(false); 
		bresume = new JButton("Fortfahren"); 
		bresume.setEnabled(false); 
		
		text=new JTextArea("Hier Klartext/Code eingeben");
		text2=new JTextArea("Hier wird der Code/Klartext ausgegeben");
		text2.setEditable(false);
		
		l = new JLabel("Zeichen: ");
		l1 = new JLabel("Zeit: ");
		l2 = new JLabel("Perf: ");
		lthreads = new JLabel("Threadanzahl auswählen:"); 
		lprioritaet = new JLabel("Threadpriorität auswählen:"); 
		
		schluessel=new JTextField("Key");
		tf = new JTextField("4"); 
		tf.setEditable(false); 
		
		cb = new JComboBox(); 
		cb.addItem("Hoch");
		cb.addItem("Mittel"); 
		cb.addItem("Wenig");
		cb.setSelectedItem("Mittel"); 
		
		JScrollPane sp = new JScrollPane(text);
		sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		JScrollPane sp2 = new JScrollPane(text2);
		sp2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		sp2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 

		sb = new JSlider(JSlider.HORIZONTAL,1,100,1);
		sb.setValue(4); 
		
		tf.setBounds(210, 510, 50, 20); 
		sb.setBounds(5,510,200,20); 
		sp.setBounds(5, 5, 475, 200);
		sp2.setBounds(5,265 , 475, 200);
		bpause.setBounds(50,235,210,20); 
		bresume.setBounds(270,235,210,20); 
		l.setBounds(5,465 , 100, 20);
		l1.setBounds(110,465 , 100, 20);
		l2.setBounds(235,465 , 150, 20);
		lthreads.setBounds(5,488,200,10); 
		lprioritaet.setBounds(275,488,150,20); 
		schluessel.setBounds(5, 210, 40, 20);
		cb.setBounds(275,510,60,20); 
		encode.setBounds(50, 210, 210, 20);
		decode.setBounds(270, 210, 210, 20);
		
		encode.addActionListener(this);
		decode.addActionListener(this);
		bpause.addActionListener(this);
		sb.addChangeListener(this); 
		
		f.add(bpause); 
		f.add(bresume);
		f.add(lprioritaet); 
		f.add(cb); 
		f.add(lthreads); 
		f.add(tf); 
		f.add(sp);
		f.add(sb); 
		f.add(sp2);
		f.add(encode);
		f.add(l);
		f.add(l1);
		f.add(l2);
		f.add(decode);
		f.add(schluessel);
		f.addWindowListener(this);
		f.setLayout(null);
		f.setResizable(false);
		f.pack();
		f.setSize(490,600);
		f.setVisible(true);
	}
	public void disable() {
		l1.setText("Zeit:"); 
		l2.setText("Perf.:"); 
		l.setText(""); 
		encode.setEnabled(false);
		decode.setEnabled(false);
		text.setEnabled(false);
		schluessel.setEnabled(false);
		sb.setEnabled(false);
		cb.setEnabled(false);
		bpause.setEnabled(true);
		bresume.setEnabled(false);
		
	}
	public void enable() {
		encode.setEnabled(true);
		decode.setEnabled(true);
		text.setEnabled(true);
		schluessel.setEnabled(true);
		sb.setEnabled(true);
		cb.setEnabled(true);
		bpause.setEnabled(false);
		bresume.setEnabled(false);
	}
	
	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		inner = new inner(arg0); 
		inner.start(); 
	
	}
	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO Auto-generated method stub
		f.dispose();
		System.gc();
		System.exit(0);
	}
	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void windowOpened(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void stateChanged(ChangeEvent arg0) {
		// TODO Auto-generated method stub
		Object source = arg0.getSource(); 
		if (source == sb){
			int value = sb.getValue(); 
			tf.setText(Integer.toString(value)); 
		}
	}
	class inner extends Thread{
		ActionEvent arg0; 
		public inner(ActionEvent arg0){
			this.arg0 = arg0; 
		}
		
		@Override 
		public void run() {
			disable();
			Object q = arg0.getSource();
			char[] enc;
			int prioritaet; 
			enc =  schluessel.getText().toCharArray();
			int anzthreads = Integer.parseInt(tf.getText()); 
			if (cb.getSelectedIndex() == 0){
				prioritaet = 10; 
			}
			else if (cb.getSelectedIndex() == 1)
			{
				prioritaet = 5; 
			}
			else {
				prioritaet = 1; 
			}
			String s = text.getText();
			if(q==encode) {
				
				l.setText("Zeichenr: "+c.count_chars(s));
				String code= c.start(s,enc[0],true,anzthreads,prioritaet);
				l1.setText("Zeit "+c.dif_time());
				l2.setText("Perf.: "+ c.char_sec(s));
				text2.setText(code);
				enable();
			} else if(q==decode){
				l.setText("Zeichenr: "+c.count_chars(s));
				String code =c.start(s,enc[0],false,anzthreads,prioritaet);
				l1.setText("Zeit "+c.dif_time());
				l2.setText("Perf.: "+ c.char_sec(s));
				text2.setText(code);
				enable();
			} else if(q==bpause) {
				c.pause();
				enable();
				bresume.setEnabled(true);
			} else if(q==bresume) {
				c.resume();
				enable();
			}

		}
	}
	
}

caesar.java
Java:
public class caesar  {

	protected
	char[] alphabet;
	long start_millis;
	Thread t1,t2,t3,t4,t5;
	String s,st1,st2,st3,st4,st5,st6,st7,st8,st9,st10;
	char key;
	boolean b1,b2,b3,b4,b5;
	boolean mode;
	String[] strings = null;
	codingThread[] threads;
	int threadanzahl;
	int prioritaet; 
	ThreadGroup tg;
	public caesar() {
		super();
		alphabet = new char[] {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
		start_millis=0;
		
	}
	
	public String start(String st, char k,boolean m, int tanzahl,int prioritaet) {
		this.prioritaet = prioritaet; 
		start_time();
		this.key=k;
		this.s=st;
		this.mode=m;
		this.threadanzahl=tanzahl;
		if ((this.threadanzahl >= this.s.length())){
			this.threadanzahl = 1; 
			debug("Thraedanzahl =="+ threadanzahl); 
		}
		strings = new String[threadanzahl+1];
		threads = new codingThread[threadanzahl+1];
		return allesaugeben(); 
	}
	
	public String  encode(String s) {
		String sneu = "";
		char[] schars;
		schars = s.toCharArray();
		int shl = indexOf(alphabet,key);
		if(shl!=-1) {
			for(int i = 0; i<=schars.length-1;i++) {
				int ckey = indexOf(alphabet,schars[i]);
				if(ckey!= -1) {
					if((shl+ckey) < alphabet.length) {
						sneu+=Character.toUpperCase(alphabet[(shl+ckey)]);
					} else {
						sneu+=Character.toUpperCase(alphabet[(shl+ckey)-alphabet.length]);
					}
				} else {
					sneu += schars[i];
				}
			}
			return sneu;
		} else {
			return "";
		}
	}
	public String decode(String s) {
		String sneu = "";
		char[] schars;
		schars = s.toCharArray();
		int shl = indexOf(alphabet,key);
		if(shl!=-1) {
			for(int i = 0; i<=schars.length-1;i++) {
				int ckey = indexOf(alphabet,schars[i]);
				if(ckey!= -1) {
					if((ckey-shl)> 0) {
						sneu+= Character.toLowerCase(alphabet[(ckey-shl)]);
					} else if((ckey-shl < 0)) {
						sneu+=Character.toLowerCase(alphabet[alphabet.length+ckey-shl]);
					} else {
						sneu+=Character.toLowerCase(alphabet[0]);
					}
				}else {
					sneu += schars[i];
				}
			}
			return sneu;
		} else {
			return "";
		}
	}
	
	public int indexOf(char[] chr , char ch) {
		try {
			for(int i=0;i<=chr.length;i++) {
				if(Character.toUpperCase(ch)==chr[i]) { //hier dann weitermache
					return i;
				}
			}
			return -1;
		} catch(ArrayIndexOutOfBoundsException e) {
			return -1;
		}
	}
	public void pause() {
		
		debug("pause");
		tg.interrupt();

	}
	public void resume() {
		tg.resume();
	}
	public String count_chars(String s) {
		double len = (double) s.length();
		String[] shr;
		shr = new String[2];
		if(len > 1000) {
			shr[0] = (Double.toString(len/1000));
			if(len > 1000000) {
				shr[0]= shr[0].substring(0,shr[0].length()-4)+"k";
			} else {
				shr[0]= shr[0].substring(0,shr[0].length()-2)+"k";
			}
		} else {
			shr[0]=Integer.toString((int)len);
		} 
		return shr[0];
	}
	public void start_time() {
		start_millis = System.currentTimeMillis();
	}
	public String dif_time() {
		long dif = System.currentTimeMillis()-start_millis;
		double tmpsec =(double) dif/1000;
		return Double.toString(tmpsec)+"sec";
	}
	public String char_sec(String s) {
		return Integer.toString((int)((double)s.length()/(((double) System.currentTimeMillis()-start_millis)/1000)))+" Zeichen/sec";
	}
	//temp
	public void debug(String s) {
		System.out.println(s);
	}
	
	class codingThread extends Thread {
		private 
			String s;
			boolean mode;
			int lastIndex;
		public codingThread(boolean b, String s_code,int i) {
			this.mode=b;
			this.s = s_code;
			this.lastIndex=i;
			this.start();
		}
		@Override
		public void run() {
			if(mode) {
				strings[lastIndex]=encode(this.s);
			} else {
				strings[lastIndex]=decode(this.s);
			}
		}
		public void warten() {
			try {
				this.join();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	public String  allesaugeben(){
		int i = 0;
		String[] sub = null;
		String s_komplett = ""; 
		tg = new ThreadGroup("The Threads"); 
		//this.threads= new Thread[threadanzahl];		
		sub = new String[threadanzahl+1];
		int l = (int) s.length()/threadanzahl;
		for(i=1;i<=(int) s.length()/l;i++ ) {
			try{
			if((i) ==(int) s.length()/l) {
				sub[i]=s.substring(l*(i-1), s.length());
				break;
			} else {
				sub[i]=s.substring(l*(i-1), (i)*l);
			}
			} catch (ArrayIndexOutOfBoundsException e) {
				
			}}
		for(i=1;i<=sub.length-1;i++) {
			//debug(""+i);
			//debusg(sub[i]);
			threads[i] = new codingThread(mode,sub[i],i);
		}
		tg.enumerate(threads); 
		tg.setMaxPriority(prioritaet); 
		debug(""+prioritaet); 
	// 	debug(""+tg);
		for(i=1;i<=strings.length-1;i++) {
			threads[i].warten();
			s_komplett+=strings[i];
		}
		return s_komplett;
		//return "";
	}
}
 

Marco13

Top Contributor
Pause/Resume muss mit einem flag geregelt werden, das in einer der inneren Schleifen von encode/decode abgefragt wird. Dort kann dann mit wait() gewartet werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
H pdf stempel - Hilfe erbeten Java Basics - Anfänger-Themen 6
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
A Hilfe beim Lesen von Pfaden und Systemvariablen Java Basics - Anfänger-Themen 3
F RegEx Hilfe Java Basics - Anfänger-Themen 5
S Hilfe bei Endlosschleife Java Basics - Anfänger-Themen 2
S Hilfe bei Praktischen Aufgaben von Arrays Java Basics - Anfänger-Themen 39
U Ich bräuchte Hilfe Java Basics - Anfänger-Themen 1
Say abstract class und Objekt erzeugen - Dringend Hilfe Java Basics - Anfänger-Themen 10
Justin4687 Benötige Hilfe bei folgender Aufgabe Java Basics - Anfänger-Themen 2
aero043 Hilfe bei BlueJ Hausübung Java Basics - Anfänger-Themen 27
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
P Hilfe gesucht Java Basics - Anfänger-Themen 11
D Hilfe bei Calculator Test Java Basics - Anfänger-Themen 15
R Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
Zentriks Hilfe zu Sieb des Eratosthenes ohne boolean Java Basics - Anfänger-Themen 5
R Java Bücher hilfe Java Basics - Anfänger-Themen 9
U HILFE! - per ActionListener Felder enablen....... Java Basics - Anfänger-Themen 5
I Scheduling: "Quartz" verwenden, Hilfe bei Umstellung Java Basics - Anfänger-Themen 3
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
L Hilfe! Liste mit Items werden ausgegeben aber nicht in zufälliger Reihenfolge Java Basics - Anfänger-Themen 6
Ekooekoo Hilfe spiel Java Basics - Anfänger-Themen 5
SpiritsHuner Hilfe!! Java Basics - Anfänger-Themen 16
Lacotto Java Kurs Aufgaben Hilfe Java Basics - Anfänger-Themen 14
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
M HILFE JPanel - Graphics Java Basics - Anfänger-Themen 1
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
X Hilfe beim Übertragen in eine For-Schleife Java Basics - Anfänger-Themen 1
Neuling47 Denkfehler? Hilfe Java Basics - Anfänger-Themen 11
S Hilfe bei Umänderung von Java Code Java Basics - Anfänger-Themen 16
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
X Erste Schritte Hilfe bei einem kleinen Spiel. Java Basics - Anfänger-Themen 19
D Bitte um Hilfe muss es schnellstmöglich erledigen Java Basics - Anfänger-Themen 15
L Hilfe bei RegEx Java Basics - Anfänger-Themen 4
I Bitte um Hilfe zu unterstehenden Code Java Basics - Anfänger-Themen 6
B Brauche Hilfe zu einem Code Java Basics - Anfänger-Themen 5
Neuling47 bräuchte dringend hilfe Java Basics - Anfänger-Themen 6
D Bräuchte Hilfe im Bezug zum printarray() Java Basics - Anfänger-Themen 4
M Bitte um Hilfe bei 2DArrays Java Basics - Anfänger-Themen 8
HeiTim Array hilfe Java Basics - Anfänger-Themen 14
M LCD-Ziffern-Hilfe Java Basics - Anfänger-Themen 6
özkan hilfe!! Java Basics - Anfänger-Themen 4
C Hilfe bei einem Anfängerprojekt Java Basics - Anfänger-Themen 25
D Abrechnung bitte um hilfe Java Basics - Anfänger-Themen 25
J Brauche Hilfe bei for-each Aufgabe Java Basics - Anfänger-Themen 1
D Zahlentabelle Anfänger braucht Hilfe Java Basics - Anfänger-Themen 1
HeiTim Brauche Hilfe soll ein nummeriertes Feld ausgeben lassen Java Basics - Anfänger-Themen 17
S Interaktive Abfrage, Hilfe mit Schleifen! Java Basics - Anfänger-Themen 6
N Hilfe bei der Installation Java Basics - Anfänger-Themen 2
J Brauche Hilfe bei Aufgabe Java Basics - Anfänger-Themen 4
S Hilfe bei Programmierung einer Hotelabrechnung Java Basics - Anfänger-Themen 5
enjoykimii Strukturierte Programmierung Hilfe Java Basics - Anfänger-Themen 29
H Bräuchte hilfe Java Basics - Anfänger-Themen 3
D Snake-Spiel ähnliche Aufgabe Hilfe Java Basics - Anfänger-Themen 3
H Brauche Hilfe Java Basics - Anfänger-Themen 2
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
H Hilfe Java Basics - Anfänger-Themen 6
H Brauche hilfe Java Basics - Anfänger-Themen 3
M Hilfe - Array Aufgabe Java Basics - Anfänger-Themen 8
R Schulaufgabe, Bruache Hilfe mit non-static Methoden Java Basics - Anfänger-Themen 2
kevkev Hilfe bei Schiffe versenken Java Basics - Anfänger-Themen 5
FelixxF Erste Schritte Hilfe bei Fußball Manager Java Basics - Anfänger-Themen 2
C Brauche Hilfe beim Schreiben eines Programmes :/ Java Basics - Anfänger-Themen 1
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
josfe1234 Hilfe access denied ("java.io.FilePermission" " " "read") Java Basics - Anfänger-Themen 12
Vivien Hilfe bei Type Conversion Java Basics - Anfänger-Themen 3
Leo0909 Ich brauche Hilfe bei dieser Aufgabe Java Basics - Anfänger-Themen 2
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J Doppelt verkette Liste ich bitte um Hilfe Java Basics - Anfänger-Themen 4
N Laufzeitberechnung - dringende Hilfe! Java Basics - Anfänger-Themen 1
G Java Hilfe Java Basics - Anfänger-Themen 3
J Java List, Bitte um Hilfe Java Basics - Anfänger-Themen 15
J Java List, bitte um Hilfe Java Basics - Anfänger-Themen 3
U anfänger braucht hilfe . wir konnten die aufgaben nicht beantworten Java Basics - Anfänger-Themen 5
A Schleifen, Hilfe! Java Basics - Anfänger-Themen 6
LeonDerStudent Hilfe bei Uniprojekt Java Basics - Anfänger-Themen 2
H Brauche Hilfe in Java Eclipse Programmieraufgabe Neuling Java Basics - Anfänger-Themen 3
B Hilfe bei Map Liste erstellen Java Basics - Anfänger-Themen 10
Kapfski Was habe ich falsch gemacht? Hilfe! Java Basics - Anfänger-Themen 17
R Java (Eclipse) "Lagerverwaltung" HILFE Java Basics - Anfänger-Themen 13
M Bräuchte Hilfe bei diesen Methoden Java Basics - Anfänger-Themen 4
dieter000 Aufgabe Hilfe Java Basics - Anfänger-Themen 18
Gaudimagspam Dringend Java Hilfe benötigt Java Basics - Anfänger-Themen 19
jonathanpizza Hilfe bei einer Übungsaufgabe Java Basics - Anfänger-Themen 6
dieter000 Hilfe bei dem Beispiel, wie gehe ich sowas am besten an? Java Basics - Anfänger-Themen 32
jonathanpizza Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
Q Hilfe auf Aufgabe(Matrixmultiplikation) Java Basics - Anfänger-Themen 1
jonathanpizza Hilfe bei der Aufgabe Java Basics - Anfänger-Themen 19
pry bitte Hilfe beim Kreditrechner objektorientiert Java Basics - Anfänger-Themen 6
R Hilfe bei removeduplicates Java Basics - Anfänger-Themen 5
D Brauche Dringend Hilfe...Prozedur/Funktionsprozedur Ergebnis augeben Java Basics - Anfänger-Themen 11
marcooooo einmal noch schnell hilfe bitte:/ Java Basics - Anfänger-Themen 2
Q Hilfe bei Hausaufgeben Java Basics - Anfänger-Themen 2
J Hilfe beim Label animieren Java Basics - Anfänger-Themen 1
S Hilfe Java Basics - Anfänger-Themen 1
JD_1998 Random Array sortieren mit Hilfe einer Methode Java Basics - Anfänger-Themen 4
Kawastori Hilfe bei Methoden Übung Java Basics - Anfänger-Themen 6
Chabub Hilfe bei Stacks und Queue Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben