1) Thread
package com.example.androidrunnable;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
class MyThread extends Thread{
/*循环标记*/
public boolean flag=false;
/*计数器*/
private int counter=0;
/*参数*/
private String threadName;
public MyThread(String _threadName){
this.threadName=_threadName;
}
public void run(){
while(flag){
Log.i("tag", threadName+" "+String.valueOf(++counter));
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class MainActivity extends Activity {
private Button startButton=null;
private Button endButton=null;
private MyThread myThread1=null;
private MyThread myThread2=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*开始线程*/
startButton=(Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if(myThread1==null){
myThread1=new MyThread("thread1");
myThread1.flag=true;
myThread1.start();
}
if(myThread2==null){
myThread2=new MyThread("thread2");
myThread2.flag=true;
myThread2.start();
}
}
});
/*结束线程*/
endButton=(Button)findViewById(R.id.endButton);
endButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if(myThread1!=null){
myThread1.flag=false;
myThread1=null;
}
if(myThread2!=null){
myThread2.flag=false;
myThread2=null;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Thread的运行结果
2) Runnable
package com.example.androidrunnable;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
class MyRunnable implements Runnable{
/*循环标记*/
public boolean flag=false;
/*计数器*/
private int counter=0;
/*参数*/
private String runnableName;
public MyRunnable(String _runnableName){
this.runnableName=_runnableName;
}
public void run(){
while(flag){
Log.i("tag", runnableName+" "+String.valueOf(++counter));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public class MainActivity extends Activity {
private Button startButton=null;
private Button endButton=null;
private MyRunnable myRunnable=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*开始线程*/
startButton=(Button)findViewById(R.id.startButton);
startButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if(myRunnable==null){
myRunnable=new MyRunnable("runnable1");
myRunnable.flag=true;
/*Runnable可以实现资源共享*/
new Thread(myRunnable).start();
new Thread(myRunnable).start();
}
}
});
/*结束线程*/
endButton=(Button)findViewById(R.id.endButton);
endButton.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
if(myRunnable!=null){
myRunnable.flag=false;
myRunnable=null;
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Runnable的运行结果
小结:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
1)避免点继承的局限,一个类可以继承多个接口。
2)适合于资源的共享
以上面的程序为例
1)Thread都各自运行,没有实现资源共享
2)Runnable实现了资源共享