Threads

A thread is a process that shares an address space and processor time with other threads. Each thread processes its program code independently.

Any class that extends the Thread class is a thread.

A thread's:

  • run()

override this. It contains the processing code of a thread.

  • start()

calls run()

  • sleep()

causes a thread to wait for a given length of time

  • boolean isAlive()

returns true if a thread has been started

  • interrupt()

interrupts a thread that is sleeping

  • boolean interrupted()

Returns true if a thread has been interrupted

A thread is ideal for running background multimedia activities such as animations, sounds and marquees.

Although the Thread class contains a stop(), suspend() and resume() method, they are no longer used. The proper way to stop a Thread prior to its normal termination is by interrupting it, as shown in the example below.

Thread_Marquee_Demo Example (Run Applet)

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Thread_Marquee_Demo extends JApplet
{
    @Override
    public void init()
    {
        this.setContentPane(new View());
    }

    public class View extends JPanel implements ActionListener
    {
        private final JButton startStop = new JButton("START");
        private final MarqueeCanvas marqueeCanvas;
        private MarqueeThread marqueeThread;

        public View()
        {
            super();

            this.marqueeCanvas = new MarqueeCanvas("Scrolling Text", 200);

            this.setLayout(new BorderLayout());
            this.add("Center", this.marqueeCanvas);
            this.add("South", this.startStop);

            this.startStop.addActionListener(this);
        }

        @Override
        public void actionPerformed(ActionEvent e)
        {
            if (this.startStop.getText().equals("START"))
            {
                this.marqueeThread = new MarqueeThread(this.marqueeCanvas);
                this.marqueeThread.start();
                this.startStop.setText("STOP");
            }
            else // this.startStop.getText() == "STOP"
            {
                this.marqueeThread.interrupt();
                this.startStop.setText("START");
            }
        }
    }

    public class MarqueeThread extends Thread
    {
        private MarqueeCanvas marqueeCanvas;

        public MarqueeThread(MarqueeCanvas marqueeCanvas)
        {
            this.marqueeCanvas = marqueeCanvas;
        }

        @Override
        public void run()
        {
            try
            {
                while (!interrupted())
                {
                    this.marqueeCanvas.incrementPos();
                    this.sleep(10); // 10/1000th = 1/100th second
                }
            }
            catch (InterruptedException e)
            {
            }
        }
    }

    public class MarqueeCanvas extends JPanel
    {
        private String message;
        private int minX;
        private int curX;
        private int maxX;
        private int y;

        public MarqueeCanvas(String message, int width)
        {
            this.message = message;
            this.y = 20;
            this.curX = 0;
            this.minX = 0;
            this.maxX = width;
        }

        @Override
        public void paintComponent(Graphics g)
        {
            super.paintComponent(g);  // clear the background
            g.drawString(this.message, this.curX, this.y);
        }

        public void incrementPos()
        {
            if (++this.curX >= this.maxX)
            {
                this.curX = this.minX;
            }
            this.repaint();
        }
    }
}
 
<div align="center"><a href="../versionC/index.html" title="DKIT Lecture notes homepage for Derek O&#39; Reilly, Dundalk Institute of Technology (DKIT), Dundalk, County Louth, Ireland. Copyright Derek O&#39; Reilly, DKIT." target="_parent" style='font-size:0;color:white;background-color:white'>&nbsp;</a></div>