android Thread和Runnable的区别

来源:互联网 发布:安卓高清网络机顶盒 编辑:程序博客网 时间:2024/05/21 08:11

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 blocke.printStackTrace();}}}}public class MainActivity extends Activity {private Button startButton=null;private Button endButton=null;private MyThread myThread1=null;private MyThread myThread2=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*开始线程*/startButton=(Button)findViewById(R.id.startButton);startButton.setOnClickListener(new Button.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View v) {if(myThread1!=null){myThread1.flag=false;myThread1=null;}if(myThread2!=null){myThread2.flag=false;myThread2=null;}}});}@Overridepublic 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 blocke.printStackTrace();}}}}public class MainActivity extends Activity {private Button startButton=null;private Button endButton=null;private MyRunnable myRunnable=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*开始线程*/startButton=(Button)findViewById(R.id.startButton);startButton.setOnClickListener(new Button.OnClickListener() {@Overridepublic 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() {@Overridepublic void onClick(View v) {if(myRunnable!=null){myRunnable.flag=false;myRunnable=null;}}});}@Overridepublic 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实现了资源共享


原创粉丝点击