Runnable接口的说用是使线程不仅可以继承Thread类实现,还可以继承其他类(比如:JFrame)。
此接口具有两个构造方法:
(1)public Thread(Runnable r)
(2)public Thread(Runnable r,String name).
这两个构造方法的参数中都存在Runnable实例,使用构造方法就可以将Runnable实例与Thread实例相关联。
使用Runnable的步骤如下:
(1)建立Runnable对象
(2)使用参数为Runnable对象的构造方法创建Thread实例
(3)调用start()方法。
例:在项目中创建SwingAndThread类,该类继承了JFrame类,实现图标移动的功能,其中使用了Swing与线程相结合的技术:


1 import java.awt.*; 2 import java.net.*; 3 4 import javax.swing.*; 5 6 public class SwingAndThread extends JFrame { 7 /** 8 * 9 */ 10 private static final long serialVersionUID = 1L; 11 private JLabel jl = new JLabel(); // 声明JLabel对象 12 private static Thread t; // 声明线程对象 13 private int count = 0; // 声明计数变量 14 private Container container = getContentPane(); // 声明容器 15 16 public SwingAndThread() { 17 setBounds(300, 200, 250, 100); // 绝对定位窗体大小与位置 18 container.setLayout(null); // 使窗体不使用任何布局管理器 19 URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL 20 Icon icon = new ImageIcon(url); // 实例化一个Icon 21 jl.setIcon(icon); // 将图标放置在标签中 22 // 设置图片在标签的最左方 23 jl.setHorizontalAlignment(SwingConstants.LEFT); 24 jl.setBounds(10, 10, 200, 50); // 设置标签的位置与大小 25 jl.setOpaque(true); 26 t = new Thread(new Runnable() { // 定义匿名内部类,该类实现Runnable接口 27 public void run() { // 重写run()方法 28 while (count <= 200) { // 设置循环条件 29 // 将标签的横坐标用变量表示 30 jl.setBounds(count, 10, 200, 50); 31 try { 32 Thread.sleep(1000); // 使线程休眠1000毫秒 33 } catch (Exception e) { 34 e.printStackTrace(); 35 } 36 count += 4; // 使横坐标每次增加4 37 if (count == 200) { 38 // 当图标到达标签的最右边,使其回到标签最左边 39 count = 10; 40 } 41 } 42 } 43 }); 44 t.start(); // 启动线程 45 container.add(jl); // 将标签添加到容器中 46 setVisible(true); // 使窗体可视 47 // 设置窗体的关闭方式 48 setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 49 } 50 51 public static void main(String[] args) { 52 new SwingAndThread(); // 实例化一个SwingAndThread对象 53 } 54 }
运行结果:
分析:在上例中,为了使图标具有滚动功能,需要在类的构造方法中创建Thread实例,在创建该实例的同时需要Runnable对象作为Thread类构造方法的参数,然后使用内部类形式实现run()方法,在run()方法中主要循环图标的横纵坐标位置,当坐标位置达到标签最右方时,再次将图标滚动到初始位置。