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. (
) .
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:
Caesar
Ich hoffe, ihr könnt mir weiterhelfen und einen schönen Rutsch wünsche ich euch.
Viele Grüße
Progsfa
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