Multithreading Example
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.*;
import javax.swing.event.*;
/**
* @author jack
*/
public class ThreadApplet extends JApplet implements Runnable {
private DrawPanel drawPanel;
private Thread mainThread;
private Runner runner1;
private Runner runner2;
private boolean runFlag = false;
public void init() {
mainThread = new Thread(this, "main");
mainThread.setPriority(1);
runner1 = new Runner();
runner2 = new Runner();
buildGUI();
}
public void buildGUI() {
JPanel panel = new JPanel(); // The content pane
panel.setLayout(new BorderLayout());
drawPanel = new DrawPanel(); // The Graphic pane
drawPanel.setPreferredSize(new Dimension(400, 200));
panel.add(drawPanel, BorderLayout.CENTER);
JSlider slider1 = new JSlider(JSlider.VERTICAL, 2, 10, runner1.getPriority());
slider1.setMajorTickSpacing(2);
slider1.setPaintTicks(true);
slider1.setPaintLabels(true);
slider1.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
runner1.setPriority(((JSlider) e.getSource()).getValue());
}
});
panel.add(slider1, BorderLayout.WEST);
JSlider slider2 = new JSlider(JSlider.VERTICAL, 2, 10, runner2.getPriority());
slider2.setMajorTickSpacing(2);
slider2.setPaintTicks(true);
slider2.setPaintLabels(true);
slider2.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
runner2.setPriority(((JSlider) e.getSource()).getValue());
}
});
panel.add(slider2, BorderLayout.EAST);
JButton but = new JButton("Start"); // the Start/Stop Button
but.addActionListener( new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Start")) {
runFlag = true;
mainThread.start();
runner1.start();
runner2.start();
((JButton)e.getSource()).setText("Stop");
} else {
runFlag = false;
((JButton)e.getSource()).setText("Done");
}
}
});
panel.add(but, BorderLayout.SOUTH);
setContentPane(panel);
}
public void run() {
Thread thisThread = Thread.currentThread();
while (runFlag) {
repaint();
try {
thisThread.sleep(60);
} catch (InterruptedException e) {
}
}
}
class DrawPanel extends JPanel {
private Ellipse2D ellipse1 = new Ellipse2D.Double();
private Ellipse2D ellipse2 = new Ellipse2D.Double();
private Line2D line1;
BasicStroke stroke = new BasicStroke(5, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND);
public void paint(Graphics g) {
int w = getWidth();
int h = getHeight();
int l = (w - 20) / 2; //this is the size of the widget
line1 = new Line2D.Float(0, 0, l/2 - 10, 0);
Graphics2D g2d = (Graphics2D) g;
g.setColor(Color.black);
ellipse1.setFrame(5, 10, l, l);
g2d.draw(ellipse1);
ellipse2.setFrame((w / 2) + 5, 10, l, l);
g2d.draw(ellipse2);
g2d.setStroke(stroke);
g2d.setColor(Color.blue);
AffineTransform at = AffineTransform.getTranslateInstance(l / 2 + 5, l / 2 + 10);
at.rotate(Math.toRadians(runner1.getDeg()));
g2d.draw(at.createTransformedShape(line1));
at = AffineTransform.getTranslateInstance(w / 2 + l / 2 + 5, l / 2 + 10);
at.rotate(Math.toRadians(runner2.getDeg()));
g2d.draw(at.createTransformedShape(line1));
}
}
class Runner extends Thread {
int deg = 0;
static final int speed = 300000;
public void run() {
while (runFlag) { // runFlag from enclosing class
for (deg = 0; deg < 360* speed ; deg++) {
}
}
}
int getDeg() {
return deg / speed;
}
}
}Threaded Applet Test<br>
Click the "Start" button to begin:<br>
<applet CODE ="ThreadApplet.class"
WIDTH ="600" HEIGHT ="300" >
</applet>