Site hosted by Angelfire.com: Build your free website today!
 

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>