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与线程相结合的技术:

 import java.awt.*;
 import java.net.*;

 import javax.swing.*;

 public class SwingAndThread extends JFrame {
     /**
      *
      */
     private static final long serialVersionUID = 1L;
     private JLabel jl = new JLabel(); // 声明JLabel对象
     private static Thread t; // 声明线程对象
     private int count = 0; // 声明计数变量
     private Container container = getContentPane(); // 声明容器

     public SwingAndThread() {
         setBounds(300, 200, 250, 100); // 绝对定位窗体大小与位置
         container.setLayout(null); // 使窗体不使用任何布局管理器
         URL url = SwingAndThread.class.getResource("/1.gif"); // 获取图片的URL
         Icon icon = new ImageIcon(url); // 实例化一个Icon
         jl.setIcon(icon); // 将图标放置在标签中
          // 设置图片在标签的最左方
         jl.setHorizontalAlignment(SwingConstants.LEFT);
         jl.setBounds(10, 10, 200, 50); // 设置标签的位置与大小
         jl.setOpaque(true);
         t = new Thread(new Runnable() { // 定义匿名内部类,该类实现Runnable接口
                     public void run() { // 重写run()方法
                         while (count <= 200) { // 设置循环条件
                              // 将标签的横坐标用变量表示
                             jl.setBounds(count, 10, 200, 50);
                             try {
                                 Thread.sleep(1000); // 使线程休眠1000毫秒
                             } catch (Exception e) {
                                 e.printStackTrace();
                             }
                             count += 4; // 使横坐标每次增加4
                             if (count == 200) {
                                 // 当图标到达标签的最右边,使其回到标签最左边
                                 count = 10;
                             }
                         }
                     }
                 });
         t.start(); // 启动线程
         container.add(jl); // 将标签添加到容器中
         setVisible(true); // 使窗体可视
         // 设置窗体的关闭方式
         setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
     }

     public static void main(String[] args) {
         new SwingAndThread(); // 实例化一个SwingAndThread对象
     }
 }

运行结果:

分析:在上例中,为了使图标具有滚动功能,需要在类的构造方法中创建Thread实例,在创建该实例的同时需要Runnable对象作为Thread类构造方法的参数,然后使用内部类形式实现run()方法,在run()方法中主要循环图标的横纵坐标位置,当坐标位置达到标签最右方时,再次将图标滚动到初始位置。

Runnable接口的更多相关文章

  1. Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。

    1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...

  2. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  3. java多线程--实现Runnable接口

    package unit8; import java.applet.Applet; import java.awt.Label; import java.awt.TextField; public c ...

  4. Java通过继承thread类与实现Runnable接口实现多线程的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 一.通过继承T ...

  5. java中多线程中Runnable接口和Thread类介绍

    java中的线程时通过调用操作系统底层的线程来实现线程的功能的. 先看如下代码,并写出输出结果. // 请问输出结果是什么? public static void main(String[] args ...

  6. Java基础之线程——使用Runnable接口(JumbleNames)

    控制台程序. 除了定义Thread新的子类外,还可以在类中实现Runnable接口.您会发现这比从Thread类派生子类更方便,因为在实现Runnable接口时可以从不是Thread的类派生子类,并且 ...

  7. 线程入门之实现Runnable接口和继承Thread类

    线程的2种使用方式:实现Runnable接口和继承Thread类 1.实现Runnable接口 实现Runnable接口,必须实现run方法,也是Runnable接口中的唯一一个方法 class Ru ...

  8. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  9. Android(java)学习笔记66:实现Runnable接口创建线程 和 使用Callable和Future创建线程

    1. 前面说的线程的实现是新写一个子类继承Thread: 是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 2. 这里说的方案2是指 ...

随机推荐

  1. 教你一招:根据身份证号计算出生年月和年龄 text函数和mid函数混用 datedif函数和today函数混用

    在电子表格Excel中,使用text函数和mid函数混用,根据身份证号计算出生年月: =text(mid(A2,,),"0!/00!/00") #0!/00!/00 为日期的格式# ...

  2. Python学习笔记 之 递归、二维数组顺时针旋转90°、正则表达式

    递归.二维数组顺时针旋转90°.正则表达式 1.   递归算法是一种直接或间接调用自身算法的过程. 特点: 递归就是在过程或函数里调用自身 明确的递归结束条件,即递归出口 简洁,但是不提倡 递归次数多 ...

  3. Map工具系列-06-销售营改增历史数据处理工具

    所有cs端工具集成了一个工具面板 -打开(IE) Map工具系列-01-Map代码生成工具说明 Map工具系列-02-数据迁移工具使用说明 Map工具系列-03-代码生成BySQl工具使用说明 Map ...

  4. java 判断String 是否为空

    StringUtils.isBlank(null) = true StringUtils.isBlank("") = true StringUtils.isBlank(" ...

  5. lua 例子

    //顶 - - - //顶 #include <stdio.h> #include <string.h> extern "C"{ #include < ...

  6. Yii2.0 用户登录详解(上)

    一.准备 在开始编写代码之前,我们需要思考一下:用户登陆模块,实现的是什么功能?很明显,是登陆功能,那么,登陆需要用户名和密码,我们在数据库的一张表中就应该准备好用户名和密码的字段,再思考一下,如果要 ...

  7. ubuntu下安装gedit插件

    因为gedit-plugins : 依赖: gir1.2-zeitgeist-2.0 所以首先 sudo apt-get install gir1.2-zeitgeist-2.0 如果报错可以先 su ...

  8. R语言:用简单的文本处理方法优化我们的读书体验

    博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html 前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实 ...

  9. 微信公众平台"微信连Wi-Fi"功能来了 线下微信增粉利器

    微信连Wi-Fi功能在第三方开发者和服务商已经有出现了,但有些成本相对会高些.近日微信公众平台新添了一个功能插件“微信连Wi-Fi”,已有微信认证过的公众号即可申请开通.赶紧去布局这个线下微信增粉利器 ...

  10. JavaScript对象的理解 及 字面量对象与数组的关系

    JavaScript的简单类型包括 数字.字符串.布尔值.null值.undefined值. 其他的值都是对象.对象是可变的键控集合.数组.函数.正则表达式都是对象. 对象是属性的容器,属性都是名字和 ...