艾巴生活网

您现在的位置是:主页>科技 >内容

科技

编程是单线程还是多线程_什么是多线程编程?多线程编程基础知识

2024-05-31 10:04:59科技帅气的蚂蚁
摘要:多线程编程是现代软件技术中非常重要的一个环节。要理解多线程,它涉及到多个进程。本文主要基于多线程编程及相关知识得出一些结论。

编程是单线程还是多线程_什么是多线程编程?多线程编程基础知识

摘要:多线程编程是现代软件技术中非常重要的一个环节。要理解多线程,它涉及到多个进程。本文主要基于多线程编程及相关知识得出一些结论。

什么是多线程编程?多线程编程技术是Java语言的一个重要特征。多线程编程的意义就是把一个程序任务分成几个并行的子任务。尤其是在网络编程中,你会发现很多功能是可以并发执行的。比如网络传输速度慢,用户输入速度慢。可以使用两个独立的线程来完成这两个功能,而不影响正常显示或其他功能。

多线程与单线程相比较。普通Windows采用单线程程序结构。它的工作原理是:主程序有一个消息循环,不断从消息队列中读取消息来决定下一步做什么,通常是为了一个函数。只有在这个函数被执行后,主程序才能接收另一个消息来执行。比如子功能的作用是读取一个网络数据或文件,只有读取完这个数据或文件才能接收下一条消息。在执行该子功能期间,您不能做任何事情。但是,读取网络数据和等待用户输入往往会花费大量时间处于等待状态。多线程可以通过使用这个特性将任务分成多个并发任务来解决这个问题。

多线程编程基础知识详解一、进程1。程序:由源代码生成的可执行应用程序。(例如QQ.app)

2.进程:一个正在运行的程序可以看作一个进程。(正在运行的QQ是一个进程),进程拥有独立运行所需的全部资源。

3.线程:在程序中独立运行的代码段。(例如接收QQ消息的代码块)

一个进程由一个或多个线程组成,进程只负责资源的调度和分配。线程是程序真正的执行单元,负责代码的执行。

二、单线程1、每个运行的程序(进程)至少包含一个线程,称为主线程。

2、主线程是在程序开始执行主功能时创建的。

3、只有一个主线程的程序称为单线程程序。

4、主线程负责执行程序的所有代码(UI呈现和刷新、网络请求、本地请求)。这些代码只能顺序执行,不能并发执行。

注意:UI呈现和刷新只能在主线程中编写。

三、多线程1、具有多个线程的程序称为多线程程序。

2、iOS允许用户自己打开新线程。与主线程相比,这些线程称为子线程。

3、子线程和主线程都是独立的单元,各自的执行互不影响,所以可以并发执行。

多线程的补充基础知识

4、默认情况下,iOS为主线程分配1M堆栈空间,为子线程分配512K堆栈空间。(分配的字节数必须是4K的整数倍)

5、分配的空间用于存储为线程中的变量打开的空间,这通常是足够的。

6、与堆栈空间不同,主线程和子线程共享同一个内存空间。

7、自动释放池默认设置在程序入口,主线程负责执行代码。子线程新打开的内存不在主线程的管辖范围内(线程互不干扰,相互独立),所以子线程为对象打开的空间不会自动释放,要手动为子线程添加一个自动释放池。

8、使用静态方法在短时间内打开大量内存空间或者使用回收便利构造函数会导致内存瞬间积累,程序崩溃,所以写@autorelease pool。

9、多线程的类型

离线程:线程结束后销毁,子线程可能离线程。

四、单线程与多线程单线程程序的区别:只有一个线程,代码按顺序执行,容易出现代码阻塞(页面假死)。

多线程程序:有多个独立运行的线程,可以有效避免代码阻塞,提高程序的运行性能。

五、JVM和多线程Java编写的JVM程序都运行在Java虚拟机(JVM)中。在JVM中,程序的多任务是通过线程来实现的。

每次用java命令启动java应用程序时,都会启动一个JVM进程。同一个JVM进程中,只有一个进程,就是它自己。在这个JVM环境中,所有过程代码都作为线程运行。JVM找到程序的入口点main(),然后运行main()方法,从而生成一个线程,这个线程叫做主线程。当主方法完成时,主过程也完成了。JVM进程也存在。

操作系统管理进程线程,轮流分配每个进程一小段时间(没有固定顺序)(不一定均等)。然后在每个进程内部,程序代码自己处理进程内部线程的时间分配,多个线程相互切换执行,也很短。

六、Java语言对多线程的支持是通过类thread和接口Runnable实现的。这里不多说了。这里强调两个地方:

//主线程的其他代码段

thread class subThread=new thread class();subthread . start();//主线程subThread.sleep的其他代码段(1000);

非分离线程:线程结束后挂起,等待唤醒,不被销毁。主线程必须是非分离线程。

10、iOS系统中多线程的实现方法

a、n对象

b、n线程

c、NSOperation和NSOperationQueue一起使用。

d,GCD(最重要的)

有人认为调用start()方法后,下面的代码必须先启动线程,然后主线程才会继续执行。调用sleep()方法后,CPU什么都不做,只是等待睡眠时间结束。其实这种理解是错误的。因为:

调用start()方法后,多线程代码不是立即执行,而是线程变得可运行,何时运行由操作系统决定。

调用Thread.sleep()方法的目的是为了防止当前线程单独占用进程获取的CPU资源,从而留出一些时间给其他线程执行(也就是依靠内部协调)。

七、线程状态切换1、新状态:创建新的线程对象。

2、 Runnable:创建线程对象后,其他线程调用对象的start()方法。处于这种状态的线程位于可运行线程池中,成为可运行的,并等待使用CPU的权利。

3、运行:就绪状态的线程获取CPU并执行程序代码。

4、阻塞状态:阻塞状态是指线程因为某种原因放弃CPU使用权,暂时停止运行。在线程进入就绪状态之前,没有机会进入运行状态。有三种阻塞情况:

等待阻塞:正在运行的线程执行wait()方法,JVM会将线程放入等待池。同步阻塞:当一个正在运行的线程获得一个对象的同步锁时,如果同步锁被另一个线程占用,JVM会将该线程放入锁池其他阻塞:当正在运行的线程执行sleep()或join()方法,或者发出I/O请求时,JVM会将该线程置于阻塞状态。当sleep()状态超时,join()等待线程终止或超时,或者I/O处理完成时,线程恢复到就绪状态。

5、 Dead:线程在执行后结束其生命周期,或者由于异常退出run()方法。

八、为什么要多线程编程?造成这种情况的原因有很多,我们可以用例子来解决。

1)有些是为了提高运行速度,比如多核cpu下的多线程。

2)有些是为了提高资源利用率。比如在网络环境下下载资源时,延迟往往很高。我们可以通过不同的线程从不同的地方获取资源,这样可以提高效率。

3)其中一些提供更好的服务,比如服务器。

4)其他需要多线程编程的地方等。

九、Java的线程模型因为Java是纯面向对象的语言,所以它的线程模型也是面向对象的。Java通过Thread类封装了一个线程所需的所有功能。为了建立一个线程,必须有一个线程执行函数,对应的是线程类的run方法。Thread类还有一个start方法,负责创建线程,相当于调用Windows的线程创建函数CreateThread。调用start方法后,如果线程建立成功,会自动调用thread类的run方法。所以任何继承Thread的Java类都可以通过Thread类的start方法建立一个线程。如果要运行自己的线程执行函数,必须重写Thread类的run方法。

在Java线程模型中,除了thread类之外,还有一个接口Runnable,标识一个Java类是否可以作为Thread类使用。这个接口只有一个抽象方法,即Java线程模型的线程执行函数。因此,线程类的唯一标准就是该类是否实现了Runnable接口的run方法,即具有线程执行功能的类就是线程类。从上面可以看出,Java建立线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口,通过Thread和Runnable类建立线程。其实这两个方法本质上是一个方法,就是都是通过thread类建立一个线程,运行run方法。但两者最大的区别是线程是通过继承Thread类建立的。虽然更容易实现,但是Java不支持多重继承。因此,如果这个线程类继承了thread,它就不能继承其他类。因此,Java线程模型提供了一种通过实现Runnable接口来建立线程的方法,使得线程类可以在必要时继承业务相关的类,而不是线程类。