`

线程的优点和风险

阅读更多
1、线程的优点
    恰当地使用线程时,可以降低开发和维护的开销,并且能够提高复杂应用的性能。线程通过把异步的工作流程转化为普遍存在的顺序流程,使程序模拟人类工作和交互变得更容易了。另一方面,它们可以把复杂、难以理解的代码转化为直接、简洁的代码,这样更容易读写及维护。
    线程在GUI应用程序中是非常有用的,可以来改进用户接口的响应性,并且在服务器应用中,用于提高资源的利用率和吞吐量。它们也可以简化JVM的实现——垃圾收集器(garbage collector)通常运行于一个或多个持续工作的线程之间。大部分至关重要的Java应用都依赖于线程,某种程度上是因为它们的组织结构需要这样。
1、1 使用多处理器
    多处理器系统以往比较昂贵、稀少,只用于大的数据中心和科学计算设备。如今,多处理器系统已经比较便宜,数量也增多了;即使低端服务器和中端的桌面系统也常常采用多处理器。这个趋势只会逐渐增加;因为处理器很难再提高它的时钟频率,取而代之的是,处理器厂商会在一块芯片上放置更多的处理器内核。所有主要的芯片制造商都开始了这种转变,并且我们已经显著地看到机器中处理器数量的增加。
    因为程序调度的基本单元是线程,一个单线程应用程序一次只能运行在一个处理器上。在双处理器系统中,一个单线程程序,放弃了其中一半的空闲CPU资源;在拥有100个处理器的系统中,这个单线程程序放弃了99%的资源。从另一方面来看,拥有多个活跃线程的程序可以同时在多处理器上运行。在设计良好的情况下,多线程程序通过更有效的利用空闲处理器资源,来提高吞吐量。
    使用多线程也可以帮助我们在单线程系统中实现更佳的吞吐量。如果一个程序是单线程的,这个处理器在等待一个同步I/O操作完成的时候,仍然是空闲的。在一个多线程程序中,当第一个线程I/O结束的同时,另外一个线程也可以运行,这样就使得程序在遇到I/O阻塞的时候仍然有进展。(这就像在等待水烧开的时间里面读报纸,优于等待水开之后再去读报。)
1、2 模型的简化
    当你需要完成的任务时统一类型(修改12个bug)的时候,掌控你的时间通常比完成多种类型的任务要容易(修改bug,面试系统管理员的替代候选人,完成你的团队的效率评估,为你下周的演讲制作幻灯片)。当你只有一种任务的时候,你可以从这堆任务的第一个开始,逐一去做,知道将它们全部完成(或者你自己精疲力尽);你不需要花精力去思考接下来去执行哪个任务。另一方面,管理多重优先级和截止日期,还要在各任务之间切换,这通常会带来一些成本开销。
    对于软件来说也是同样的道理:相对于需要同时管理多重类型的任务,一个顺序处理相同类型任务的程序,写起来更简单,更少出错,也更容易测试。在模拟的情况下,为每一个类型的任务分配一个线程,或者为每一个元素分配一个线程,提供理想上的顺序,并且这样做可以把域逻辑(domain logic)与时序调度的细节隔离开来,进行相互交替的操作,进行异步I/O,以及等待资源。一个复杂、异步的流程可以被分解为一系列更简单的同步流程,它们中每一个在相互独立的线程中运行,只有在特定的同步点才进行彼此的交互。
    这些优点通常被一些框架(framework)所使用,比如Servlet或者远程方法调用(RMI,Remote Method Invocation)。这些框架需要处理请求管理,线程创建和负载均衡的细节,与此同时还要处理不同部分转发到合适的组件的相应流程状态中区。Servlet的开发者不需要担心容器究竟同时正在处理多少个请求,或者Socket的输入输出流是否阻塞;当一个Servlet的Service方法作为Web请求的相应被调用时,它可以同步地处理这些请求,就想它使一个单线程程序一样。这可以简化组件开发,并且可以使学习曲线变缓。
1、3 对异步事件的简单处理
    一个服务器应用程序,接受来自多个远程客户端的连接,如果每一个连接服务器都为其分配一个线程,并允许使用同步I/O,这样的程序开发起来更容易。
    如果程序在读取Socket时没有可用数据,那么read方法会被阻塞直到有数据可用。在一个单线程应用程序中,这不仅意味着处理相应的请求停止了,也意味着在线程阻塞期间对所有请求的处理都停止了。为了避免这样的问题,单线程服务器程序被迫使用了非阻塞I/O,这要比同步I/O复杂得多,也更容易出错。然而,如果每一个请求都拥有自己的线程,那么阻塞就不会影响到其他请求的处理了。
    历史上,操作系统把一个进程能够创建的线程限制在相对较少的数量上,大约有几百个(甚至更少)。因此,操作系统未多元化的I/O开发了一些高效的机制,比如Unix的select和poll系统调用,为了访问这些机制,Java类库对非阻塞I/O提供了一组包(java.nio)。然而,今天的操作系统在支持更大数量的线程方面有了巨大的进步,这使得即使是在那些拥有许多客户的平台上,“每线程每客户(thread-per-client)”模型也是现实的。
1、4 用户界面的更佳相应性
    GUI阴功程序过去通常为单线程的,这意味着你要么通过大量输入时间频繁地测试整个代码(这通常杂乱无章且麻烦),要么执行所有的应用代码,间接地贯穿整个主事件循环(main event loop)。如果从主事件循环中调用的代码执行的时间过长,那么直到代码执行完毕,用户界面看上去都是冻结的,因为在控制权返回到主事件循环之前,程序无法执行用户界面事件。
    AWT和Swing工具集这样的现代GUI框架,用事件派发线程(event dispatch thread,EDT)取代了主事件循环,当一个用户界面事件发生时,比如按下一个按钮,事件线程会调用程序定义的时间处理器。大部分GUI框架都是单线程化的子系统,所以主事件循环的有效性仍然可以得到体现,但是它运行于它自身线程GUI toolkit的控制下,而并非受控于应用程序。
    在事件发生的线程中如果只有短暂的任务,那么界面总能够作出相应,因为事件线程总能够及时有效地处理好用户的活动。然而,在事件线程中处理一个长期、耗时的任务,比如一个大文档的拼写检查,或者从网络上获取一个资源,这会削减相应的效率。如果用户在这个任务运行的时候发生了一个新的动作,事件线程能够开始处理甚至知晓这个动作将会被延迟很久。雪上加霜的情况是,不仅UI失去了相应,而且用户很可能不能取消这个不愉快的任务,即使程序提供了cancel按钮,因为事件线程正在忙碌工作,知道那个冗长的任务结束,才能够开始处理cancel按钮的按下事件!但是,如果让这个耗时的任务运行在单独的线程里,那么事件线程就能能够自由地处理UI事件,使之具有更好的响应能力。
2、线程的风险
    Java对线程内置的支持是一把双刃剑。它通过提供语言和类库,以及一个规范的跨平台存储模型(这个规范的存储模型使得在Java中开发“一次开发,随处运行(write-once,run-anywhere)”的并发程序成为可能),简化了并发程序的开发。这样做同时还提高了开发人员的门槛,因为更多的程序需要使用线程。
2、1安全危险
2、2活跃度的危险
2、3性能危险
分享到:
评论

相关推荐

    狂神说多线程详解.rar

    2. 挑战:线程安全问题、死锁和活锁风险、上下文切换开销。 六、多线程应用实例 1. Web服务器:处理来自多个客户端的请求。 2. 数据库系统:并发执行查询操作。 3. GUI应用程序:主线程处理用户交互,其他线程处理...

    电脑线程查看工具(cports)

    2. **资源关联**:cports能够展示线程与系统资源,如端口、内存、硬盘等的关联,有助于用户定位可能造成系统瓶颈或安全风险的线程。 3. **线程筛选**:用户可以根据各种条件(如线程状态、资源使用率等)筛选和排序...

    C#多线程扫描器

    - **多线程优点**:提高程序的并发性,充分利用多核CPU资源,改善用户体验,如后台下载和前台操作可以同时进行。 - **C#中的线程创建**:C#中可以通过`Thread`类创建线程,或者使用`Task`类和`async/await`关键字...

    apache中的线程

    这种方式的优点在于,由于进程间不共享内存,因此避免了线程同步的问题,降低了数据错误的风险。然而,它需要更多的CPU和内存资源,因为每个进程都是独立的。在`prefork`模式下,配置文件`httpd-mpm.conf`中的`...

    c# 多线程

    #### 二、多线程的优点与缺点 1. **多线程的好处:** - **提高CPU利用率**:在多线程程序中,当一个线程处于等待状态时,CPU可以继续执行其他线程,这极大地提高了程序的效率。 - **响应性增强**:在用户界面应用...

    c#在多线程中访问Form中控件的多种解决方案

    在 Windows Forms 应用程序开发中,多线程技术被广泛应用于提高应用程序的响应性和性能。然而,在多线程环境中访问 UI 控件(如 `TextBox`)时,会遇到一个常见的问题:跨线程访问异常。由于 .NET Framework 的安全...

    C#多线程与异步的区别

    - **减少死锁风险**:异步操作通常采用回调函数或事件驱动的方式,这有助于减少因线程间共享资源导致的死锁问题。 **缺点**: - **编程复杂度高**:异步编程模型与传统的同步编程模型相比更为复杂,需要开发者具备...

    Pker多线程后台急速扫描器

    Pker多线程后台急速扫描器是一款针对网站安全的高效工具,主要用于检测和扫描潜在的后台漏洞和敏感地址。在网络安全日益重要的今天,此类工具的应用对于保障系统安全、防止未授权访问具有重要意义。本文将详细介绍...

    多线程后台扫描工具

    使用这种多线程后台扫描工具,用户可以高效且安全地检测其网站或系统的安全状况,确保其免受恶意攻击和数据泄露的风险。同时,了解工具的使用方法、配置和解读扫描结果也是十分重要的,以确保能够及时采取必要的安全...

    不是多线程的群发邮件

    本文将深入探讨“不是多线程的群发邮件”这一话题,揭示这种方法的优点、可能的实现方式以及其与多线程群发邮件的区别。 首先,我们要理解什么是多线程。多线程是一种编程概念,它允许程序同时执行多个任务。在多...

    多线程笔记

    这种方式的优点在于可以直接访问线程对象的方法和属性,缺点是由于Java不支持多继承,因此如果需要同时继承其他类,则无法使用这种方式。 2. **实现Runnable接口** ```java public class MyRunnable implements...

    进程查看工具 线程查看工具 端口占用查看工具

    除了tcpView,还有其他类似工具,如Windows自带的任务管理器、Process Explorer和Wireshark等,它们各有特点,适用于不同场景。例如,Wireshark是一个强大的网络封包分析工具,能深入分析网络通信细节。 总的来说,...

    AOP在JAVA多线程监控中的应用

    - 设计并实现一种有效的死锁检测算法,通过分析锁的获取和释放顺序来判断是否存在死锁风险。 - 集成到监控框架中,一旦检测到死锁情况,立即通知开发者并提供可能的解决方案建议。 #### 结论与展望 通过上述设计...

    IOS 多线程文档

    - **1.5.8 线程安全的库**: 选择经过验证的线程安全库来降低出错的风险。 #### 四、线程管理 ##### 2.1 线程成本 创建和销毁线程需要一定的开销,频繁创建线程会增加系统的负担。 ##### 2.2 创建一个线程 - **...

    多线程的那点儿事.zip

    在实际应用中,开发者需要权衡多线程的优点和潜在风险,合理设计线程模型。例如,使用线程池来限制并发线程的数量,减少线程创建和销毁的开销;使用异步编程模型(如Java的CompletableFuture,Python的asyncio)来...

    20多任务和多线程[定义].pdf

    标题和描述中的“多任务和多线程[定义]”指向的主题是关于操作系统中的多任务处理与多线程编程的概念。多任务是指操作系统允许多个程序或多个程序中的多个部分(任务)同时运行的能力,而多线程是指在单一程序内允许...

    Java编程中线程池的最大风险规避

    线程池的工作队列通常依赖`wait()`和`notify()`等方法来协调线程间的任务获取。这些方法如果使用不当,很容易导致并发错误,比如错过唤醒通知,使得工作线程始终处于等待状态,从而忽略了工作队列中待处理的任务。...

Global site tag (gtag.js) - Google Analytics