Genau das versuche ich. Da ich aber ein Anfänger bin, fällt mir das doch noch recht schwer. Ich suche ja schon den ganzen Vormittag das Problem zu lösen. : (
An einem Tag gleichzeitig mit Multithreading und mit Swing anzufangen ist auch eher mutig.
Thomas hat Recht.
public class DominoC implements Runnable
{
String monteurName = "Inhalt"; // camelCase !!!
NotesSession nSession= null;
public void run()
nSession = yourStuffComesHere.
...
}
Aber das ist nur der Anfang.
Mit Multithreading musst du ein paar mehr Dinge beachten.
Du weisst, dass du run() nicht direkt aufrufen kannst?
Gruß Axel
public class DominoC implements Runnable
{
public String testvar = "jupp";
public
DominoC() {}
public void run()
{
try
{
Session s = NotesFactory.createSession("localhost");
Database db = s.getDatabase("","test.nsf");
String testvar = doc.getItemValueString("RESM_Name");
...
...
String p = s.getPlatform();
String cu = s.getCommonUserName();
String nv = s.getNotesVersion();
String sn = s.getServerName();
String un = s.getUserName();
testvar="wasDuWolle"; /// HIER HIER HIER
System.out.println(nv);
System.out.println(sn);
System.out.println(p);
System.out.println(db.getTitle());
System.out.println(v.getName());
s.recycle();
}
catch (NotesException n) {
System.out.println("ID: " + n.id + " -- Name: " + n.text);
}
catch (Exception e){
e.printStackTrace();}}
}
Das sieht erstmal trivial aus. S. bold Zeile.
Das Problem ist aber zu kontrollieren, wann das gesetzt wird, wenn du mit mehreren Threads arbeitest.
Threads laufen eben parallel.
In einer anderen Klasse rufst du dominoC.start() auf. Dies setzt den in der Run-Methode Thread in den Ready-to-run Status. Irgendwann läuft der los. Du weisst nur nicht so recht wann.
Mit Multithreading hast du nicht mehr ein Programm, das sequentiell abgearbeitet wird, sondern mehrere Threads, die parallel laufen. Genau das kompliziert das Verständnis für den Programmablauf in einem sehr hohen Grade.
Wenn du nach dem Aufruf von start() s.o. die Variable im parent-Thread abfragst, ist nicht sicher, dass sie dann schon gesetzt ist.
Wie sieht der Teil aus, wo du start() aufrufst, poste das bitte.
Wobei ich wenig Zeit habe.
Aufruf (rund um dominoC.start(): (dies ist KEIN robuster code, könnte aber funktionieren).
dominoC.start(); // oder wie immer du das DominoC Objekt genannt hast.
Thread.currentThread().sleep(5000); // diesen Thread wird 5 sek schlafen gelegt.
// der andere Thread müsste jetzt laufen.
System.out.println("dominoC.testVar=" + dominoC.testVar); // wird in run Methode gesetzt. s. o.
//vereinfacht:
public class DominoC implements Runnable
{
public String testvar = "jupp";
public
DominoC() {}
public void run()
{
Session s = null;
try
{
s = NotesFactory.createSession("localhost");
testvar="wasDuWolle"; /// HIER HIER HIER
s.recycle();
s = null;
}
catch (Throwable e) {
e.printStackTrace();
// sieht komisch aus, ist aber wichtig!!!!
if (s!= null) {
try {
s.recycle();
s=null;
} catch (Throwable e) {}
}
caller:
public class gkstart {
public static void main(String[] args) {
//
DominoC dc = new DominoC();
Thread nt = new Thread((Runnable)dc);
nt.start();
Thread.currentThread().sleep(5000); // dieser Thread wird 5 sek schlafen gelegt.
// der andere Thread müsste jetzt laufen --> der in run, s.o.
// nach 5 sek. oder später wacht dieser Thread wieder auf und printed:
System.out.println("dc.testVar=" + dc.testVar); // wird in run Methode gesetzt. s. o.
//
gkgui gui = new gkgui();
new gkgui().show();
//
}
}
VON EINER RÜCKGABEVARIABLE AUS RUN HAST DU SOWIESO NICHTS.
Das ist ja ein eigener Thread und läuft PARALLEL (asynchron) zu deinem Restprogramm.
Es bereitet mir doch Kopfschmerzen, um zu begreifen, was da jetzt genau passiert.
mir auch. Multithreading zu verstehen und effizient zu managen ist definitiv hart. Meist hat man aber zumindest mit Thread-Management wenig zu tun. Eher schon, dass eine Komponente von mehreren Threads benutzt wird. Das ist aber einfacher als selbst Threads zu steuern (was du hier machst).
Im Grunde sind das in der Run-Methode und dein main 2 Programme.
Vielleicht noch in Swing oder SWT relativ häufig, aber das ist da relativ immer der gleiche Trick.
NIE. NIEMALS. NEVER. NUNCA das catch statement leer lassen. S. mein
Ausnahme: Das schliessne einenr connection in einem catch-Block.
code.
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace(); // WICHTIG
}
Jetzt käme das nächste Problem. Die ausgelesene Variable in die gui zu übernehmen. Heisst. Nachdem die DominoC.class sauber durchgelaufen ist, wird jetzt als nächstes die gui.class geladen. Hier soll jetzt die Variable weiterverarbeitet werden.
Übergibs im KOnstruktor.
gkgui gui = new gkgui(testVar);
Der Konstruktor muss dann ca. so aussehen:
class gkgui { // KLASSEN SCHREIBT MAN GROSS.
String testVar;
public gkgui(String testVar) {
this.testVar = testVar;
}