Hallo,
versuche verzweifelt eine Interthread-Kommunikation hinzukriegen. Dazu hab ich mein Programm auf das nötigste Reduziert.
- Hauptprogramm mit zwei Threads
- Der eine Thread schickt dem zweiten alle 5 Sekunden ein Notify
- Der zweite meldet dies dem User
- alles ist über ein Object obj synchronisiert
Das nachfolgende Programm ist lauffähig.
Problem:
Beide Threads arbeiten, aber der zweite Thread reagiert nicht mit wait() auf das notify des anderen.
Vielen Dank zum Voraus
PS: Kann man mit Notify auch einen Wert oder ein Objekt mitsenden?
versuche verzweifelt eine Interthread-Kommunikation hinzukriegen. Dazu hab ich mein Programm auf das nötigste Reduziert.
- Hauptprogramm mit zwei Threads
- Der eine Thread schickt dem zweiten alle 5 Sekunden ein Notify
- Der zweite meldet dies dem User
- alles ist über ein Object obj synchronisiert
Das nachfolgende Programm ist lauffähig.
Problem:
Beide Threads arbeiten, aber der zweite Thread reagiert nicht mit wait() auf das notify des anderen.
Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.UIManager;
public class ThreadTest extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
JPanel topPanel;
JButton testButton;
String programname = "ThreadTest";
static JFrame frame;
JTextArea logTextArea;
JScrollPane logTextAreaScrollPane;
Object obj = new LogData();
Thread timeThread;
Thread receiveThread;
public static void main(String[] args) {
frame = new JFrame(); // Frame = Window
frame.setBounds(1920, 0, 600, 1200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ThreadTest());
frame.setVisible(true);
}
public ThreadTest() {
try {
frame.setTitle(programname);
// **************************************************************************************************
// GUI BEGIN
// **************************************************************************************************
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {}
topPanel = new JPanel();
frame.add(topPanel);
this.add(topPanel, BorderLayout.NORTH);
topPanel.paintAll(this.getGraphics());
testButton = new JButton("Send");
testButton.setBounds(20, 20, 95, 22);
topPanel.add(testButton);
testButton.addActionListener(this);
receiveThread = new Thread(new ReceiceThread());
receiveThread.start();
try {
Thread.sleep(300);
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(frame.getRootPane(), e.getMessage());
}
timeThread = new Thread(new TimeThread());
timeThread.start();
} catch (RuntimeException runtimeExeption) {
runtimeExeption.printStackTrace();
JOptionPane.showMessageDialog(this.getRootPane(), "Runtime exception:" + runtimeExeption.getMessage());
}
}
public void actionPerformed(ActionEvent event) {
String cmd = event.getActionCommand();
if (cmd.equals("Send")) {
}
}
class TimeThread implements Runnable {
@Override public void run() {
while (true) {
synchronized(obj) {
try {
Thread.sleep(5000);
obj.notify();
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(frame.getRootPane(), e.getMessage());
}
}
}
}
}
class ReceiceThread implements Runnable {
@Override public void run() {
while (true) {
synchronized(obj) {
try {
obj.wait();
java.awt.Toolkit.getDefaultToolkit().beep();
JOptionPane.showMessageDialog(frame.getRootPane(), "Meldung erhalten");
} catch (InterruptedException e) {
JOptionPane.showMessageDialog(frame.getRootPane(), e.getMessage());
}
}
}
}
}
}
Vielen Dank zum Voraus
PS: Kann man mit Notify auch einen Wert oder ein Objekt mitsenden?