Android 线程

Android沿用了Java的线程模型,一个Android应用在创建的时候会开启一个线程,我们叫它主线程或者UI线程。如果我们想要访问网络或者数据库等耗时操作时,都会开启子线程去处理,从Android3.0开始,系统要求网络访问必须在子线程中进行,否则会抛出NetworkOnMainThreadException异常。

说到了线程,我们得讲讲线程的基础知识:
什么是进程:
进程是操作系统的基础,是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的基本单位。在Windows任务管理器里,列表中的exe程序就是一个进程。进程就是程序的实体,是受操作系统管理的基本运行单元。

什么是线程:
线程是操作系统调度的最小单元,也叫作轻量级进程。在一个进程中可以创建多个线程,这些线程都拥有各自的计数器,堆栈和局部变量等属性,并且能够访问共享的内存变量。

使用多线程的好处:
·使用多线程可以减少程序的响应时间。如果某个操作很耗时,或者陷入长时间的等待,此时程序将不会响应鼠标和键盘等的操作,使用多线程后可以把这个耗时的操作分配到一个单独的线程中去执行,从而使程序具备了更好的交互性。

·与进程相比,线程创建和切换开销更小,同时多线程在数据共享方面效率非常高。

·多CPU或者多核计算机本身就具备执行多线程的能力。如果使用单个线程,将无法重复利用计算机资源,这会造成资源的巨大浪费。在多CPU计算机中使用多线程能提高CPU的利用率。 ·使用多线程能简化程序的结构,使程序便于理解和维护。

线程的状态:
Java线程在运行中的声明周期中可能会处于6种不同的状态,这6种线程状态分别为如下所示。
·New:新创建状态。线程被创建,还没有调用start方法,在线程运行之前还有一些基础工作要做。 
·Runnable:可运行状态。一旦调用start方法,线程就处于Runnable状态。一个可运行的线程可能正在运行也可能没有运行,这取决于操作系统给线程提供运行时间。
·Blocked:阻塞状态。表示线程被锁阻塞,它暂时不活动。
·Waiting:等待状态。线程暂时不活动,并且不运行任何代码,这消耗最少的资源,直到线程调度器重新激活它。
·Timed waiting:超时等待状态。和等待状态不同的是,它是可以在指定的时间自行返回的。
·Terminated:终止状态。表示当前线程已经执行完毕。导致线程终止有两种情况:
第一种就是run方法执行完毕正常退出;第二种就是因为一个没有捕获的异常而终止了run方法,导致线程进入终止状态。

创建线程
多线程的实现有3种方法:
1、继承Thread类,重写run()方法
Thread本质上也是实现了Runnable接口的一个实例。需要注意的是调用start()方法后并不是立即地执行多线程的代码,而是使该线程变为可运行状态,什么时候运行多线程代码是由操作系统决定的。以下是其主要步骤:
(1)定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此,run()方法被称为执行体。
(2)创建Thread子类的实例,即创建了线程对象。
(3)调用线程对象的start()方法来启动该线程。
public class TestThread extends Thread{
Public void run(){
System.out.println(“Hello World1”);
}
public static void main(String[] args){
Thread mThread=new TestThread();
}
}
2、实现Runnable接口,并实现该接口的run()方法
以下是其主要步骤:
(1)自定义类并实现Runnable接口,实现run()方法
(2)创建Thread子类的实例,用实现Runnable接口的对象作为参数实例化该Thread对象。
(3)调用Thread的start()方法来启动该线程。
public class TestRunnable implements Runnable{
public void run(){ 
System.out.println(“Hello World!”); 

}
public class TestRunnable{
public static void main(String[] args){
TestRunnable mTestRunnable=new TestRunnable();
Thread mThread=new Thread(mTestRunnable);
mThread.start();
}
}
3、实现Callable接口,重写call()方法
Callable接口实际上属于Executor框架中的功能类,Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能,主要表现为以下3点:
(1)Callable可以在任务接受后提供一个返回值,Runnable无法提供这个功能。
(2)Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常。
(3)运行Callable可以拿到一个Future对象,而Future对象表示异步计算的结果,它提供了检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数的返回值,在这种情况下就可以使用Future来监视目标线程调用call()方法的情况。但调用Future的get()方法以获得结果时,当前线程就会阻塞,直到call()方法返回结果。
public class TestCallable{
//创建线程类
public static class MyTestCallable implements Callable{
public String call() throws Exception{
return “Hello World”; 
}

}
public static void ,main(String[] args){
MyTestCallable mMyTestCallable=new MyTestCallable();
ExecutorService mExecutorService=Executors.newSingleThreadPool();
Future mfuture=mExecutorService.submit(mMyTestCallable);
try{
//等待线程结束,并返回结果
System.out.println(mfuture.get());
       }catch(Exception e){
     E.printStackTrace(); 
      }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值