首页 > 编程知识 正文

多线程是java程序的什么机制(java多线程锁机制)

时间:2023-05-06 01:57:13 阅读:69722 作者:4619

一.安卓多线程的由来

启动APP后,Android系统将启动Linux

进程。 此流程包含名为UI Thread或Main Thread的Thread。 一个APP应用程序的所有组件通常都在此一个流程中执行。 当然,可以通过修改Manifest.xml中代码块()的android:Process属性来指定在不同的process上运行。 如果在组件启动时进程已存在,则该组件将直接从此进程启动,并在此进程的UI中运行

正在练习。 UI Thread运行许多重要逻辑,包括系统事件处理、用户输入事件处理、UI绘制、服务和Alarm,如下图所示。

UI Thread包含的逻辑

我们编写的业务逻辑代码(例如网络访问、绘图和监视用户的各种手势处理等)一系列耗时的操作阻止了UI线程的执行。 android系统的默认等待时间为5秒,过期会导致ANR错误,因此必须单独启动线程来处理这些操作。 处理结果经常被用于更新UI接口,而安卓的UI

工具不是线程安全的,不能在非UI线程上更新UI。 所有接口的更新都必须在UI线程上进行。

2 .多线程的四种机制

1.

Handler Thread2。

同步任务3。

真红pool executor 4。

国际服务

Handler Thread

Android的主线程包含一个消息队列“消息队列”,它可以存储一组消息或Runnable对象。 使用Handler,可以将消息或Runnable对象发送到此消息队列并处理这些对象。 每次创建新的Handle对象时,都会绑定到您创建的线程(即UI线程及其消息队列)。 从此,handler将消息对象或Runnable对象传递到消息队列,并在退出队列时执行。

Handler可以将消息对象或Runnable对象推入消息队列,以便在UI线程中检索消息或运行Runnable对象。 Handler推入消息队列的方法有两种:开机自检和发送消息。

信箱

可以将Runnable对象入队到消息队列中。 该方法是post(runnable )/postattime ) runnable,long )/post delayed (runnable,long )

对于handler post方法,将Runnable对象传递到消息队列,然后用该Runnable对象重写run ()方法。 通常(此run ) )方法需要在UI线程上进行操作才能写入。

handler开机自检的使用方法

sendMessage :

在sendMessage中,可以将包含消息数据的消息对象推入消息队列。 该方法是sendemptymessage(int )/sendmessage )/sendmessageattime (消息,长期)/sendmessagedelayed (消息延迟) )。

如果Handler使用sendMessage方法将消息入队到消息队列中,则必须传递消息对象。 此外,Handler还需要重写handleMessage ()方法以获取工作线程传递的消息。 此方法在UI线程上执行。 消息是final类,无法继承。

处理程序定义

如何使用handler sendMessage

优缺点

1. Handler的使用方法简单易懂,可以汇总多个异步任务更新UI的代码简单易懂

2 .经常处理单个异步任务代码

适用范围

1 .更新多个异步任务UI

同步任务

AsyncTask是android提供的轻量级异步类,直接继承AsyncTask,在类中实现异步操作,提供反馈当前异步执行程度的接口,最后将执行结果反馈给UI主线程。

同步任务在块队列BlockingQuery中存储要执行的任务,并使用静态线程池THREAD_POOL_EXECUTOR提供一定数量的线程。 默认值为128。 在Android 3.0之前,默认情况下使用并行任务执行器;在3.0之后,默认情况下更改为使用串行任务执行器;在静态串行任务执行器SERIAL_EXECUTOR中在周期中检索任务并将其传递给THREAD_POOL_EXECUTOR线程进行,完成一个任务后执行以下任务:

使用方法示例:

类下载

dTask extends AsyncTask{

// AsyncTask

//后面尖括号内分别是参数(例子里是线程休息时间),进度(publishProgress用到),返回值类型

@Override

protected void onPreExecute(){

//第一个执行方法

super.onPreExecute();

}

@Override

protected String doInBackground(Integer... params){

//第二个执行方法,onPreExecute()执行完后执行

for(int i=0;i<=100;i++){

publishProgress(i);

try {

Thread.sleep(params[0]);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

return "执行完毕";

}

@Override

protected void onProgressUpdate(Integer... progress){

//这个函数在doInBackground调用publishProgress时触发,虽然调用时只有一个参数

//但是这里取到的是一个数组,所以要用progesss[0]来取值

//第n个参数就用progress[n]来取值

tv.setText(progress[0]+"%");

super.onProgressUpdate(progress);

}

@Override

protected void onPostExecute(String result){

//doInBackground返回时触发,换句话说,就是doInBackground执行完后触发

//这里的result就是上面doInBackground执行后的返回值,所以这里是"执行完毕"

setTitle(result);

super.onPostExecute(result);

}

}

优缺点

1. 处理单个异步任务简单,可以获取到异步任务的进度

2. 可以通过cancel方法取消还没执行完的AsyncTask

3. 处理多个异步任务代码显得较多

适用范围

1. 单个异步任务的处理

ThreadPoolExecutor

ThreadPoolExecutor提供了一组线程池,可以管理多个线程并行执行。这样一方面减少了每个并行任务独自建立线程的开销,另一方面可以管理多个并发线程的公共资源,从而提高了多线程的效率。所以ThreadPoolExecutor比较适合一组任务的执行。Executors利用工厂模式对ThreadPoolExecutor进行了封装,使用起来更加方便。

Executors提供了四种创建ExecutorService的方法,他们的使用场景如下:

1. Executors.newCachedThreadPool()

创建一个定长的线程池,每提交一个任务就创建一个线程,直到达到池的最大长度,这时线程池会保持长度不再变化

2. Executors.newFixedThreadPool()

创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活的回收空闲的线程,当需要增加时,

它可以灵活的添加新的线程,而不会对池的长度作任何限制

3. Executors.newScheduledThreadPool()

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer

4. Executors.newSingleThreadExecutor()

创建一个单线程化的executor,它只创建唯一的worker线程来执行任务

适用范围

1. 批处理任务

IntentService

IntentService继承自Service,是一个经过包装的轻量级的Service,用来接收并处理通过Intent传递的异步请求。客户端通过调用startService(Intent)启动一个IntentService,利用一个work线程依次处理顺序过来的请求,处理完成后自动结束Service。

特点

1. 一个可以处理异步任务的简单Service

ThreadPoolExecutor

ThreadPoolExecutor提供了一组线程池,可以管理多个线程并行执行。这样一方面减少了每个并行任务独自建立线程的开销,另一方面可以管理多个并发线程的公共资源,从而提高了多线程的效率。所以ThreadPoolExecutor比较适合一组任务的执行。Executors利用工厂模式对ThreadPoolExecutor进行了封装,使用起来更加方便。

ThreadPoolExecutor

Executors提供了四种创建ExecutorService的方法,他们的使用场景如下:

1. Executors.newCachedThreadPool()

创建一个定长的线程池,每提交一个任务就创建一个线程,直到达到池的最大长度,这时线程池会保持长度不再变化

2. Executors.newFixedThreadPool()

创建一个可缓存的线程池,如果当前线程池的长度超过了处理的需要时,它可以灵活的回收空闲的线程,当需要增加时,

它可以灵活的添加新的线程,而不会对池的长度作任何限制

3. Executors.newScheduledThreadPool()

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,类似于Timer

4. Executors.newSingleThreadExecutor()

创建一个单线程化的executor,它只创建唯一的worker线程来执行任务

适用范围

1. 批处理任务

IntentService

IntentService继承自Service,是一个经过包装的轻量级的Service,用来接收并处理通过Intent传递的异步请求。客户端通过调用startService(Intent)启动一个IntentService,利用一个work线程依次处理顺序过来的请求,处理完成后自动结束Service。

特点

1. 一个可以处理异步任务的简单Service

参考:http://www.jianshu.com/p/2b634a7c49ec

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。