android Thread和Runnable的区别

本文通过实例比较了Thread类与Runnable接口在多线程应用中的使用区别。重点介绍了Runnable如何实现资源共享,并强调了其实现方式相较于Thread类的优势。

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实现了资源共享


好的,这是一个关于线程优先级动态创建静态创建线程的问题,需要结合操作系统的知识进行回答。下面是我的回答: 首先,利用RT-Thread设计三个线程,其中线程thread1动态创建,而线程thread2Thread Flag3是静态创建。代码如下: ```c #include <rtthread.h> #include <rtdevice.h> /* thread1 entry */ static void thread1_entry(void* parameter) { while(1) { rt_thread_mdelay(1000); // 延时1s } } /* thread2 entry */ static void thread2_entry(void* parameter) { while(1) { rt_kprintf("thread2 is running!\n"); rt_thread_mdelay(500); // 延时0.5s } } /* thread flag3 entry */ static void thread_flag3_entry(void* parameter) { rt_uint32_t count = 0; rt_uint8_t flag = 0; while(1) { if(count < 5) { flag = 1; } else if(count >= 5 && count < 10) { flag = 0; } else { count = 0; flag = 1; } rt_thread_delay(10); // 延时10个OSTicks rt_hw_interrupt_set_flag(RT_THREAD_FLAG_GET(), flag); // 设置线程标志 count++; } } int main(void) { /* 创建thread1 */ rt_thread_t thread1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 25, 5); if(thread1 != RT_NULL) { rt_thread_startup(thread1); } /* 创建thread2 */ rt_thread_t thread2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 24, 5); if(thread2 != RT_NULL) { rt_thread_startup(thread2); } /* 创建thread flag3 */ rt_thread_t thread_flag3 = rt_thread_create("thread_flag3", thread_flag3_entry, RT_NULL, 512, 26, 5); if(thread_flag3 != RT_NULL) { rt_thread_startup(thread_flag3); } return 0; } ``` 其中,线程thread1的优先级为25,线程thread2的优先级为24,Thread Flag3的优先级高于thread1。 其次,优先级较高的Thread2抢占低优先级的thread1,执行完毕后自动被系统脱离。优先级较低的thread1被设计成死循环,循环中有让出CPU使用权的动作,使用了delay函数。该线程在Thread2退出运行之后开始运行,每隔一段时间运行一次,并一直循环运行下去。Thread Flag3实现一个周期为10个OSTicks的方波,要求在thread1thread2中添加代码,能够在虚拟逻辑分析仪中观察到对应的状态。 在thread1thread2中添加代码,能够在虚拟逻辑分析仪中观察到对应的状态,代码如下: ```c /* thread1 entry */ static void thread1_entry(void* parameter) { while(1) { rt_thread_mdelay(1000); // 延时1s rt_hw_interrupt_set_flag(RT_THREAD_FLAG_GET(), 1); // 设置线程标志 } } /* thread2 entry */ static void thread2_entry(void* parameter) { while(1) { rt_kprintf("thread2 is running!\n"); rt_thread_mdelay(500); // 延时0.5s rt_hw_interrupt_set_flag(RT_THREAD_FLAG_GET(), 0); // 设置线程标志 } } ``` 这样,在虚拟逻辑分析仪中就可以观察到对应的状态了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值