单线程和多线程的优缺点是什么

单线程和多线程的优缺点是什么,第1张

线程就是进程只有一个线程

多线程就是进程有多个线程

多线程处理的优点

同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。多线程处理可以同时运行多个过程。例如,文字处理器应用程序在您处理文档的同时,可以检查拼写(作为单独的任务)。由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能:

多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。

当前没有进行处理的任务可以将处理器时间让给其他任务。

占用大量处理时间的任务可以定期将处理器时间让给其他任务。

可以随时停止任务。

可以分别设置各个任务的优先级以优化性能。

是否需要创建多线程应用程序取决于多个因素。在以下情况下,最适合采用多线程处理:

耗时或大量占用处理器的任务阻塞用户界面 *** 作。

各个任务必须等待外部资源(如远程文件或 Internet 连接)。

例如,用于跟踪 Web 页上的链接并下载满足特定条件的文件的 Internet 应用程序“robot”。这种应用程序可以依次同步下载各个文件,也可以使用多线程同时下载多个文件。多线程方法比同步方法的效率高很多,因为即使在某些线程中远程 Web 服务器的响应非常慢,也可以下载文件。

http://cache.baidu.com/c?word=%B6%E0%3B%CF%DF%B3%CC%3B%B5%C4%3B%D3%C5%B5%E3&url=http%3A//www%2Edaima%2Ecom%2Ecn/Info/94/Info31410/&b=0&a=4&user=baidu#0

下面是多线程的例子

还在Dos时代,人们就在寻求一种多任务的实现。于是出现了TSR类型的后台驻留程序,比较有代表性的有Side Kick、Vsafe等优秀的TSR程序,这类程序的出现和应用确实给用户使用计算机带来了极大的方便,比如Side Kick,我们编程可以在不用进编辑程序的状态下,一边编辑源程序,一边编译运行,非常方便。但是,Dos单任务 *** 作系统的致命缺陷注定了在Dos下不可能开发出真正的多任务程序。进入Windows3.1时代,这种情况依然没有根本的改变,一次应用只能做一件事。比如数据库查询,除非应用编得很好,在查询期间整个系统将不响应用户的输入。

进入了Windows NT和Windows 9x时代,情况就有了彻底的改观, *** 作系统从真正意义上实现了多任务(严格地说,Win9x还算不上)。一个应用程序,在需要的时候可以有许多个执行线程,每个线程就是一个小的执行程序, *** 作系统自动使各个线程共享CPU资源,确保任一线程都不能使系统死锁。这样,在编程的时候,可以把费时间的任务移到后台,在前台用另一个线程接受用户的输入。对那些对实时性要求比较高的编程任务,如网络客户服务、串行通信等应用时,多线程的实现无疑大大地增强了程序的可用性和稳固性。

线程的概念:Thread  每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。

多线程的概念:  多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

多线程的特点:使用线程可以把占据长时间的程序中的任务放到后台去处理

用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以d出一个进度条来显示处理的进度 。

程序的运行速度可能加快  ·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。

在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

线程定义比较抽象,简单的说就是一个代码执行流。许多执行流可以混合在一起由CPU调度。线程是允许各种任务交互执行的方式。

Java的线程在 *** 作系统的实现模式依系统不同而不同,可能是系统级别的进程或线程,但对于程序员来说并没有影响。

任务交互的一个好处是增加程序响应。如一个界面程序执行一段耗时的数据库查询,使用单独的线程可以让界面依然响应用户的其他输入,而单线程只能等待查询结束再处理。

JVM以及 *** 作系统会优先处理优先级别高的线程,但不代表这些线程一定会先完成。设定优先级只能建议系统更快的处理,而不能强制。

另外,在运行时,并没有按照函数分界,而是按照机器码/汇编码分界。也就是说不保证任何一段代码是被完整而不打断的执行的(除非你已经使用同步手段)。正由于如此,各种线程同步的方法应运而生。

你钻了牛角尖了。不要从cpu耗时上看,并行一般是为了任务处理。并发是为了资源共享和资源的充分利用。二者可比性不大。

你所说的cpu一般是指,分时系统中的cpu,比如linux,其中一个用户A的一个线程要30个小时完成,另外一个用户B的线程需要1000个小时。而且其中需要用户不断响应,如果没有并发,B用户先开始,A用户需要等待1030小时。如果使用并发,A用户可能四五十个小时就搞定了。如果A和B都比较有money,一人买一台,没有这个问题的。这就是并行。资源充足怎么着都行,资源不足只能找折中方案了。

如果你觉得这是进程的概念,java里一样的。你做过web开发吧。你肯定不想每个请求都分一个服务器吧。开发一个网页,一台电脑同时有上千个人访问你的tomcat,一般不会有问题。浏览也顺畅。这就是并发的作用。这种情况如果使用单线程。一千个人有999个人等着看你的网页,而第一个人 *** 作的时候cpu大部分时间是空闲的。怎么利用起来就成了个问题。这也叫效率。

如果确实必须要考虑问题处理的效率问题。你访问数据库的时候用过线程池吗?是不是能缩短访问数据库所耗费的时间。所以效率高不高不能只看cpu用了多少时间。你可以再考虑考虑,不用多线程,你怎么设计一个单线程程序,同时监听键盘和麦克风的信息录入?

其实计算机底层是有天然的异步特性的。这个东西就是中断。有些耗时的io *** 作,什么时候处理完是可以不用管的。剩下的无关线程就可以自由自在的进行了。这样效率是不是也高了。

单cpu一般也是多核的。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9965978.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存