安卓
Android中的多线程主要分为两类:主线程与子线程
- APP一启动,本身就是一个线程,这个线程被称为主线程mainThread,负责显示界面,跟用户交互。 界面通常被称为UI(User
Interface),主线程也被称为UI线程。 - 其余为子线程
两个原则(同样适用于ios):
- 主线程不能执行网络请求/文件读写等耗时操作
- 子线程不能执行UI刷新
程序例子,写一个耗时操作,假设从网络获取了字符串
private String getStringFormNet(){
//假设从网络获取了字符串
String result = ''
StringBulider stringBulider = new StringBulider();
//模拟一个耗时操作
for(int i=0,i<100,i++){
stringBulider.append("字符串"+i)
}
try{
//此处休眠5s
Thread.sleep(5000):
}
catch(InterruptedException e){
e.printStackTrace();
}
result = stringBulider.toString();
return result;
}
假设主线程来运行上面耗时操作
public class MainActivity extends AppCompatActivity{
private TextView tvContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvContent = findViewById(R.id.tv_content);
}
public void start(View view){
//做一个耗时任务
Thread thread = new Thread(new Runnable(){
@Override
public void run(){
String stringFormNet = getStringFormNet();
tvContent.setText(stringFormNet();
}
});
thread.start();
Toast.makeText(this,"任务完成!",Toast.LENGTH_SHORT).show();
}
private String getStringFormNet(){
//假设从网络获取了字符串
String result = ''
StringBulider stringBulider = new StringBulider();
//模拟一个耗时操作
for(int i=0,i<100,i++){
stringBulider.append("字符串"+i)
}
try{
//此处休眠5s
Thread.sleep(5000):
}
catch(InterruptedException e){
e.printStackTrace();
}
result = stringBulider.toString();
return result;
}
}
运行结果,直接显示"任务完成!"然后退出进程,说明主进程无法直接运行耗时操作!
IOS
在iOS和macOS开发中,处理并发和多线程是常见的需求,以提高应用程序的性能和响应性。Pthreads
、NSThread
、GCD
(Grand Central Dispatch)、NSOperation
和 NSOperationQueue
是几种常用的技术和框架,它们各有特点和适用场景。
1. Pthreads
Pthreads
是POSIX线程(Portable Operating System Interface for uniX threads)的缩写,是C语言标准的一部分,用于提供线程、互斥锁、条件变量等线程同步功能。虽然它功能强大,但因为是C语言级别的API,所以在Objective-C或Swift中使用时可能会感觉比较底层和繁琐,且需要手动管理线程的生命周期和同步问题。
2. NSThread
NSThread
是Cocoa框架提供的一个轻量级的线程类,它封装了POSIX线程(Pthreads)的功能,并提供了面向对象的接口。使用NSThread
可以更方便地创建、启动、暂停、恢复和停止线程。然而,和直接使用Pthreads一样,NSThread
也需要开发者手动管理线程的生命周期和同步问题,这可能会导致代码变得复杂且难以维护。
3. GCD
GCD
(Grand Central Dispatch)是Apple推出的一种高效的并发编程工具,它允许开发者将任务分配到多个核心上并行执行,而无需创建和管理线程。GCD会自动管理线程的生命周期和同步问题,大大简化了并发编程的复杂度。GCD使用队列(Queues)和任务(Blocks或Functions)来管理并发任务,开发者可以通过将任务添加到不同的队列(串行队列、并发队列、主队列等)来控制任务的执行顺序和优先级。
4. NSOperation & NSOperationQueue
NSOperation
和 NSOperationQueue
是基于GCD的更高级别的并发编程框架,它们提供了面向对象的并发编程接口。NSOperation
是一个抽象类,代表了一个将要执行的任务。开发者可以通过继承NSOperation
类并重写其main
方法来定义任务的具体执行内容。NSOperationQueue
则负责管理NSOperation
对象的队列,包括任务的添加、取消、执行顺序和优先级等。与GCD相比,NSOperation
和NSOperationQueue
提供了更丰富的功能,如任务依赖、取消操作等,使得并发编程更加灵活和强大。