public class ClassName extends Object implements Runnable
当一个类实现Runnable接口后,还需要实现其run()方法,在run()方法中,可以编写要执行的操作的代码。
例如,要创建一个实现了Runnable接口的Activity,可以使用下面的代码:
public class MainActivity extends Activity implements Runnable {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
@Override
public void run() {
//要执行的操作
}
}
12.1.2 开启线程
创建线程对象后,还需要开启线程,线程才能执行。Thread类提供了start()方法用于开启线程,其语法格式如下:
start()
例如,存在一个名称为thread的线程,如果想开启该线程,可以使用下面的代码:
thread.start(); //开启线程
12.1.3 线程的休眠
线程的休眠就是让线程暂停一段时间后再次执行。同Java一样,在Android中,也可以使用Thread类的sleep()方法让线程休眠指定的时间。sleep()方法的语法格式如下:
sleep(long time)
其中参数time用于指定休眠的时间,单位为毫秒。
例如,想要线程休眠1秒钟,可以使用下面的代码:
Thread.sleep(1000);
12.1.4 中断线程
当需要中断指定的线程时,可以使用Thread类提供的interrupt()方法来实现。使用interrupt()方法可以向指定的线程发送一个中断请求,并将该线程标记为中断状态。interrupt()方法的语法格式如下:
interrupt()
例如,存在一个名称为thread的线程,如果想中断该线程,可以使用下面的代码:
… //省略部分代码
thread.interrupt();
… //省略部分代码
public void run() {
while( !Thread.currentThread().isInterrupted() ){
… //省略部分代码
}
}
另外,由于当线程执行wait()、join()或sleep()方法时,线程的中断状态将被清除并抛出InterruptedException,所以,如果想在线程中执行了wait()、join()或sleep()方法时中断线程,就需要使用一个boolean型的标记变量来记录线程的中断状态,并通过该标记变量来控制循环的执行与停止。例如,通过名称为isInterrupt的boolean型变量来标记线程的中断,关键代码如下:
private boolean isInterrupt=false; //定义标记变量
… //省略部分代码
… //在需要中断线程时,将isInterrupt的值设置为true
public void run() {
while(!isInterrupt){
… //省略部分代码
}
}
12.1.5 范例1:通过实现Runnable接口来创建线程
例12.1 在Eclipse中创建Android项目,名称为12.1,通过实现Runnable接口来创建线程、开启线程和中断线程。(实例位置:光盘\TM\sl\12\12.1)
(1)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,然后在默认添加的线性布局管理器中添加两个按钮,一个用于开启线程,另一个用于中断线程,具体代码请参见光盘。
(2)打开默认添加的MainActivity,让该类实现Runnable接口,修改后的创建类的代码如下:
public class MainActivity extends Activity implements Runnable {}
(3)实现Runnable接口中的run()方法,在该方法中,判断当前线程是否被中断,如果没有被中断,则将循环变量值加1,并在日志中输出循环变量的值,具体代码如下:
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
i++;
Log.i("循环变量:", String.valueOf(i));
}
}
(4)在该MainActivity中,创建两个成员变量,具体代码如下:
private Thread thread; //声明线程对象
int i; //循环变量
(5)在onCreate()方法中,首先获取布局管理器中添加的“开始”按钮,然后为该按钮添加单击事件监听器,在重写的onCreate()方法中,根据当前Activity创建一个线程,并开启该线程,具体代码如下:
Button startButton = (Button) findViewById(R.id.button1); //获取“开始”按钮
startButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
i = 0;
thread = new Thread(MainActivity.this); //创建一个线程
thread.start(); //开启线程
}
});
(6)获取布局管理器中添加的“停止”按钮,并为其添加单击事件监听器,在重写的onCreate()方法中,如果thread对象不为空,则中断线程,并向日志中输出提示信息,具体代码如下:
Button stopButton = (Button) findViewById(R.id.button2); //获取“停止”按钮
stopButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (thread != null) {
thread.interrupt(); //中断线程
thread = null;
}
Log.i("提示:", "中断线程");
}
});
(7)重写MainActivity的onDestroy()方法,在该方法中中断线程,具体代码如下:
@Override
protected void onDestroy() {