实现线程的两种方式

来源:互联网 发布:多层嵌套 知乎 编辑:程序博客网 时间:2024/05/22 05:01

在Java中主要提供了两种方式实现线程,分别是继承java.lang.Thread类与实现java.lang.Runnable接口。


继承Thread类

Thread类是java.lang包中的一个类,从这个类中实例的对象代表线程,程序员启动一个线程需要建立Thread实例。

Thread类中常用的两个构造方法如下:

■ public Thread(String threadName)
■ public Thread()

其中第一个方法是创建一个名称为threadName对象。

继承Thread类创建一个新的线程

public class ThreadTest extends Thread{    //代码块}

完成 线程真正功能的代码放在类run()方法中,当一个类继承Thread类后,就可以在该类中覆盖run()方法,将实现该线程功能的代码写入run()方法中,然后同时调用Thread类中的start()方法执行线程,也就是调用run()方法。

Thread对象需要一个任务来执行,任务是指在启动时执行的工作,该工作的代码被写在run方法中。

public void run(){    //代码块 }

当执行一个程序时,就自动产生一个线程,主方法正是在这个线程上运行的。当不再启动其他线程时,该程序就为单线程程序。主方法线程启动由Java虚拟机负责,程序员负责启动自己的线程。

public static void main(String[] args){    //创建并运行线程    new ThreadTest().start();}

Demo
继承Thread实例

public class ThreadTest extends Thread {  //继承Thread类    private int count=50;    public void run(){   //重写run方法        while(true){            //打印我吃了几个苹果            System.out.println("我吃了第"+count+"个苹果");            //判断结束循环的条件            if(--count==0){                return;            }        }    }    public static void main(String[] args) {        //两种方式任一即可        //第一种方式        ThreadTest tt=new ThreadTest();        tt.start();        //第二种方式        new ThreadTest().start();    }}

实现Runnable接口

Thread类的实质就是实现了Runnable接口,其中的run()方法正是对象Runnable接口中的Run()方法的具体实现。

到目前为止,线程都是通过扩展Thread类来创建的,如果我们需要继承其他类(非Thread类)并且该程序可以使用线程,就需要使用Runnable。例如,一个扩展JFrame的GUI程序不再继承Thread类,因为Java语言不支持多继承,这时该类就需要实现Runnable接口使其具有使用线程的功能。

实现Runnable接口

public class Thread extends Object implements Runnable{    //代码块 }

实现Runnable接口的程序会创建一个Thread对象,并将Runnable对象与Thread对象相关联。Thread类中有两个构造方法:

■ public Thread(Runnable r)
■ public Thread(Runnable r,String name)

这两个构造方法的参数中都存在Runnable实例,使用以上构造方法就可以将Runnable实例与Thread实例相关联。

使用Runnable接口启动新的线程的步骤如下:

(1)建立Runnable对象(2)使用参数为Runnable对象的构造方法创建Thread实例(3)调用start()方法启动线程。

通过Runnable接口创建线程时,首先要编写一个实现Runnable接口的类,然后实例化该类的对象,这样就建立了Runnable对象;接下来使用相应的构造方法创建Thread实例;最后使用该实例调用Thread类中的start()方法。

实现实例调用Runnable接口创建线程的流程

这里写图片描述

Demo:

import java.awt.Container;import java.net.URL;import java.util.Random;import javax.swing.*;import java.net.URL; public class SwingAndThread extends JFrame{    //声明了JLabel对象    private JLabel jl=new 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("/picture/a.gif");        //实例化一个Icon        Icon icon=new ImageIcon(url);        //将图标放在标签中        jl.setIcon(icon);        //设置图片在标签的最左方        jl.setHorizontalAlignment(SwingConstants.LEFT);        //设置标签的位置与大小        jl.setBounds(10,10,200,50);        jl.setOpaque(true);        //定义匿名内部类,该类实现了Runnable接口        t=new Thread(new Runnable(){            public void run(){       //重写run()方法                while(count<=200){    //设置循环条件                    jl.setBounds(count,10,200,50);   //将标签的横坐标用变量表示                    try {                        t.sleep(1000);   //使用线程休眠1000毫秒                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        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对象    }}
原创粉丝点击