通过几个例子来了解Handle Runnable Thread HandleThread的关系.

//Handler直接pos Runnable的例子
//Handler直接把一个Runnable对象放入消息队列,将会执行Runnable的run方法体
//Handler这里可以理解为Handle只是用来发送消息,不过消息有点特别,消息的内容是执行Runnable的run方法体
//new Handler();括弧没有指定参数,所以Handler处理消息是在本线程(Activity的main线程)处理.
package com.maok.handlertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class HandlerTest extends Activity {
    /** Called when the activity is first created. */

	private Button startButton = null;
    private Button endButton = null;
    
    Handler handler = new Handler();
<strong>    Runnable updataThread = new Runnable(){

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("线程消息");
			handler.postDelayed(updataThread, 3000);
		}};</strong>
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startButton = (Button)findViewById(R.id.button1);
        endButton = (Button)findViewById(R.id.button2);
        
        startButton.setOnClickListener(new startButtonListener());
        endButton.setOnClickListener(new endButtonListener());
        
        
    }
    class startButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			<strong>handler.post(updataThread);</strong>
		}
    	
    }
    class endButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			<strong>handler.removeCallbacks(updataThread);</strong>
			
		}
    	
    }
    
    
}


//复写Handler的handleMessage函数,决定了Handle将如何处理消息;  
//复写了handleMessage后便可接受其他地方发过来的消息(一般是在另外线程处理耗时比较高的过程,然后发消息给主线程的Handler,由
//handleMessage函数处理UI的更新),例子三就是实现这个功能.  
package com.maok.handlertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class HandlerTest extends Activity {
    /** Called when the activity is first created. */

	private Button startButton = null;
    private Button endButton = null;
    
    Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			System.out.println("有消息");
			switch(msg.arg1){
			
			case 101:
				System.out.println("执行...");
				break;
			case 102:
				break;
			}
			super.handleMessage(msg);
		}
    	
    };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startButton = (Button)findViewById(R.id.button1);
        endButton = (Button)findViewById(R.id.button2);
        
        startButton.setOnClickListener(new startButtonListener());
        endButton.setOnClickListener(new endButtonListener());
        
        
    }
    class startButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Message msg = new Message();
			msg.arg1 = 101;
			handler.sendMessage(msg);
		}
    	
    }

//创建一个线程来执行Runnable的run方法体.
//主线程利用handler.sendMessage()和新线程单方面通信
//新线程-->(通知)主线程

package com.maok.handlertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class HandlerTest extends Activity {
    /** Called when the activity is first created. */

	private Button startButton = null;
    private Button endButton = null;
    
    Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch(msg.arg1){
			
			case 101:
				System.out.println("收到线程工作消息..");
				break;
			case 102:
				break;
			}
			super.handleMessage(msg);
		}
    	
    };

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startButton = (Button)findViewById(R.id.button1);
        endButton = (Button)findViewById(R.id.button2);
        
        startButton.setOnClickListener(new startButtonListener());
        endButton.setOnClickListener(new endButtonListener());
        
        
    }
    Runnable r = new Runnable(){

		@Override
		public void run() {
			// TODO Auto-generated method stub
			for(int i = 0;i < 10;i++){
				Message msg = new Message();
				msg.arg1 = 101;
				System.out.println("线程工作中..." + Thread.currentThread().getId());
				handler.sendMessage(msg);
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
		}};
		
    class startButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			Thread updataThread = new Thread(r);
			updataThread.start();
		}
    }
//创建一个线程,线程有自带的looper
//绑定消息处理到新线程的looper
//主线程利用handler.sendMessage()和新线程单方面通信
//主线程调用Message msg = new Message();msg.arg1 = 101;handler.sendMessage(msg);----->(通知)新线程
//处理过程在新线程处理.
//和方法3比起来,这中方法更灵活.
package com.maok.handlertest;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class HandlerTest extends Activity {
    /** Called when the activity is first created. */

	private Button startButton = null;
    private Button endButton = null;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startButton = (Button)findViewById(R.id.button1);
        endButton = (Button)findViewById(R.id.button2);
        
        startButton.setOnClickListener(new startButtonListener());
        endButton.setOnClickListener(new endButtonListener());
        
        
    }

    class myHandler extends Handler{

		public myHandler() {
			super();
			// TODO Auto-generated constructor stub
		}

		public myHandler(Looper looper) {
			super(looper);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch(msg.arg1){
			
			case 101:
				System.out.println("处理过程工作在-->" + Thread.currentThread().getId());
				break;
			case 102:
				break;
			}
		}
    	
    }
    
    class startButtonListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			HandlerThread p = new HandlerThread("updata_Thread");
			p.start();
			Handler handler = new myHandler(p.getLooper());
			Message msg = new Message();
			msg.arg1 = 101;
			handler.sendMessage(msg);
		}
    }



### Java 中 ThreadRunnable关系及其实现多线程的原理 #### 1. **ThreadRunnable 的基本概念** - **Thread 类** `Thread` 是 Java 提供的一个核心类,用于表示一个独立运行的任务。通过扩展 `Thread` 类并重写其 `run()` 方法,可以直接创建一个新的线程[^1]。 - **Runnable 接口** `Runnable` 是一个功能性接口,其中定义了一个无参、无返回值的抽象方法 `run()`。通过实现这个接口并将其实例传递给 `Thread` 构造器,可以间接地启动新线程[^2]。 两者的主要区别在于设计模式的不同:`Thread` 更加面向对象化,而 `Runnable` 则强调任务与线程的解耦合。 --- #### 2. **ThreadRunnable 的联系** 尽管它们表面上看起来不同,但实际上二者紧密相连: - 当我们直接使用 `Thread` 创建线程时,默认情况下它的父类已经实现了 `Runnable` 接口。 - 如果选择实现 `Runnable` 接口,则需要手动将其实例传入到 `Thread` 的构造函数中去初始化新的线程实例[^1]。 这种设计允许开发者灵活选择适合项目需求的方式来构建自己的应用程序结构——既可以单独依赖于 `Thread` 自身的能力,也可以借助外部定义好的逻辑单元(即实现了 `Runnable` 的那些类)来增强可维护性和复用率。 --- #### 3. **代码示例解析** ##### (1)通过继承 `Thread` 类实现多线程 下面展示如何通过继承 `Thread` 来创建简单的多线程应用: ```java class MyThread extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + ": " + i); } } } public class Main { public static void main(String[] args) { MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); thread1.start(); // 启动第一个线程 thread2.start(); // 启动第二个线程 } } ``` 在这个例子中,每个 `MyThread` 对象都代表一条独立的工作流;当调用了各自的 `start()` 方法之后,JVM 就会安排这些工作流按照一定规则交替执行直至结束[^1]。 ##### (2)通过实现 `Runnable` 接口实现多线程 接下来再看另一个版本的例子,这次改用 `Runnable` 方式来做同样的事情: ```java class Task implements Runnable { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + ": " + i); } } } public class Main { public static void main(String[] args) { Task task = new Task(); Thread thread1 = new Thread(task, "Thread-1"); Thread thread2 = new Thread(task, "Thread-2"); thread1.start(); // 启动第一个线程 thread2.start(); // 启动第二个线程 } } ``` 这里值得注意的是,虽然只存在唯一的一份 `Task` 实例,但由于每次新建 `Thread` 都复制了一份对该实例的引用,所以最终还是会产生两条完全分开运作的路径[^2]。 --- #### 4. **两种方式的选择依据** | 特性 | 继承 `Thread` | 实现 `Runnable` | |--------------------|------------------------------------|--------------------------------| | 扩展能力 | 占用了一个继承的机会 | 不占用额外的继承机会 | | 资源共享便利程度 | 较难 | 易于实现资源共享 | | 设计哲学 | 偏向于单体式的解决方案 | 主张职责分离 | 通常推荐优先考虑后者,因为大多数时候我们的目标只是希望某些特定功能能够在后台持续运转而已,并不需要改变基础架构太多东西[^2]。 --- ### 结论 综上所述,在实际开发过程中应当根据具体情况权衡利弊做出最佳决策。如果仅仅是想快速搭建原型或者测试想法的话,那么直接派生自 `Thread` 可能更为直观简单些;然而对于大型复杂系统而言,则往往倾向于采纳基于接口的设计思路以便更好地组织代码层次结构以及促进组件间交互协作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值