技术开发 频道

Android开发中的多线程编程技术

  Java中的实现线程体方式2

  上面介绍继承Thread方式实现线程体,下面介绍另一种方式,这种方式是提供一个实现接口Runnable的类作为一个线程的目标对象,构造线程时有两个带有Runnable target参数的构造方法:

  Thread(Runnable target);

  Thread(Runnable target, String name)。

  其中的target就是线程目标对象了,它是一个实现Runnable的类,在构造Thread类时候把目标对象(实现Runnable的类)传递给这个线程实例,由该目标对象(实现Runnable的类)提供线程体run()方法。这时候实现接口Runnable的类仍然可以继承其他父类。

  请参看代码清单8-2,这是一个Java AWT的窗体应用程序,完整代码请参考chapter8_2工程中chapter8_2_1代码部分。

  【代码清单8-2】

public class chapter8_2_1 extends Frame implements ActionListener, Runnable {

    
private Label label;
    
private Button button1;
    
private Thread clockThread;
    
private boolean isRunning = false;
    
private int timer = 0;

    
public chapter8_2_1() {
        button1
= new Button("结束计时");
        label
= new Label("计时器启动...");
        button1.addActionListener(this);
        setLayout(
new BorderLayout());
        add(button1,
"North");
        add(label,
"Center");
        setSize(
320, 480);
        setVisible(
true);

        clockThread
= new Thread(this);
        
/* 线程体是Clock对象本身,线程名字为"Clock" */
        clockThread.start();
/* 启动线程 */
        isRunning
= true;
    }

    @Override
    
public void actionPerformed(ActionEvent event) {
        isRunning
= false;
    }

    @Override

    
public void run() {
        
while (isRunning) {
            try {
                Thread.currentThread().sleep(
1000);
                
timer++;
                label.setText(
"逝去了 " + timer + "");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    
public static void main(String args[]) {
        chapter8_2_1 a
= new chapter8_2_1();
    }

}

  其中关于Java AWT知识本书就不在这里介绍了,有兴趣的读者可以自己看看相关书籍。在本例中构建AWT窗体的应用程序方式是继承Frame类。采用第1种方式——继承方式实现线程体是不可以的,因为Java是单继承的,这个类不能既继承Frame又继承Thread。应该采用第2种方式——实现Runnable接口方式。Runnable接口也有一个run()方法,它是实现线程体方法,其代码处理与上一节是一样。需要注意的是,在第2种方法中,创建了一个Thread成员变量clockThread,才用构造方法new Thread(this)创建一个线程对象,其中创建线程使用的构造方法是Thread(Runnable target),其中的this就是代表本实例,它是一个实现了Runnable接口的实现类。

  程序运行结果如图8-7所示,屏幕开始加载的时候线程启动开始计算时间,1s更新一次UI,当单击“结束计时”按钮时,停止计时。


▲图8-7 运行结果图

1
相关文章