多线程编程几个误区

多线程的优势是针对单线程而言的

对多线程的布道在几年前较为常见,那时候PC已经完成从单核到多核的转变,但很多应用程序依然是单线程的,无法发挥多核CPU的威力。多线程的优势也就是让几个内核同时工作,最大化CPU的计算能力。

如果发现很多工作特别是IO工作运行在GetMessage或者Select线程上,就应该考虑多线程了。

线程池的优势是针对新建线程而言的

为什么要使用线程池,因为线程的创建和销毁是很昂贵的操作。对于昂贵的对象我们要尽量复用,其结果就是各种池,比如线程池,连接池。使用线程池可以省下线程创建与销毁的开销,设计良好的线程池还可以防止在负载较高时大量线程耗光内存。

如果代码中有 new Thread() 考虑使用线程池代替。

使用线程池线程进行同步IO操作仍然是同步的

这可能是最容易被误解的地方。特别是在Java中,当有人问:“这里的同步访问怎样防止进程阻塞”时,最常见的回答就是“使用线程池”。这个回答有其合理性,比如当前线程是UI线程或者读取socket的线程时,这些线程是不应该阻塞在IO上的。但这个问题的另一面是:IO操作依然是阻塞的,只不过这回阻塞在worker线程上了。这一点很重要,因为有时候我们本来就跑在worker上,这个时候再往线程池里面扔就没有意义,甚至可能造成两个线程都被阻塞。

在Java的世界中,很多项目,甚至很多大项目,比如CXF和Jersey,都是使用线程池来模拟异步操作。这种方法在负载比较低的时候能够加快响应,但一旦线程池出现排队则没什么用甚至有负作用。这是Java一个很尴尬的地方,.net在提出异步方法时把BCL也更新了以适应变化。尽管Java从1.4开始就有了non-blocking IO,但NIO即使在今天仍然算得上新事物,采用率很低。尤其是jdbc没有异步接口成功了一个很大的问题。实践中如果追求异步便要求所有代码都异步,如果sql访问不能异步则一切都是空谈。

其实异步的情况下并不需要多线程

异步的好处关键在于控制了线程数量,这带来两个直接的好处:

  • 节省内存,大并发的情况下线程会吃掉大量内存
  • 避免了线程上下文切换的额外开销

理论上讲每个CPU使用一个线程,便能够最大限度的发挥硬件的潜力同时不产生浪费,当然这是很理想的情况。现实是应用程序在OS的调度下和其它程序共享资源。但避免线程切换带来的好处在大并发的情况下依然是很明显的。

时间: 2024-10-24 20:07:46

多线程编程几个误区的相关文章

DELPHI下多线程编程的几个思维误区(QDAC)

有几个网友私下问我一些有关线程的事情.过节写个东西上来大家交流. 思维误区1,自己新建的THREAD是线程,自己的主程序不是线程. 很多人在多线程编程没有把主线程也当作线程.其实主线程也是线程.看起来是废话,这个话确实很重要,这个就意味着,在DELPHI中,不光你开的线程,还有你的主线程所有的内存分配也是串的,进锁排队的.主线程和线程的区别 A.一般来说主线程的优先级高了点.(当然你也可以自己设置) B.主线程在WIN下是处理APPLICATION的消息. 其他基本与你自建线程无区别. 所以这一

多线程编程核心技术总结(读周志明书籍的总结)

多线程编程核心技术总结 1.Java多线程基本技能 1.1进程和线程的概念: 进程是独立的程序,线程是在进程中独立运行的子任务. 1.2使用多线程 1.2.1实现方法:继承Thread类,重写Runnable接口. 1.2.2线程安全问题:并发修改公共的实例变量,i++,i-- 1.3线程Thread类的一些方法: currentThread() 放回代码段正在被那个线程调用 isAlive() 判断线程是否处于活动状态 sleep() 使得当前线程退出CPU片段,等待获取锁 1.4停止线程 1

Java基础知识—多线程编程(五)

概述 Java 给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径.使用多线程也是为了充分的利用服务器资源,提高工作效率. 线程生命周期 线程是一个动态执行的过程,它也有一个从产生到死亡的过程. 新建状态: 使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态.它保持这个状态直到程序 start() 这个线程. 就绪状态: 当线程对象调用了start()方法之后,该

第73课 Qt中的多线程编程

1. QThread类 (1)QThread是一个跨平台的多线程解决方案 (2)QThread以简洁易用的方式实现多线程编程 2. QThread中的关键成员函数 (1)virtual void run() :线程函数,用于定义线程功能(执行流). (2)void start():启动函数,将线程入口地址设置为run函数.启动线程,新线程开始执行run函数. (3)int exec():进入事件循环,直至调用exit().返回线程退出事件循环的返回码. (4)void terminate():强

多线程编程(进程和线程)

多线程编程(进程和线程) 1.进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程可以启动多个线程. 2.线程:指程序中一个执行流程,一个进程中可以运行多个线程. 一.创建线程(两种方式) 二.线程的5种状态( New,Runnable,Running,Block,Dead ): 三.线程的优先级 四.守护线程 /精灵线程/后台线程 五.方法 六.同步代码锁(synchronized) 一.创建线程(两种方式): 方式1:采用继承Thread的方法 第一,继承 Thre

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

iOS多线程编程

1. 进程,线程, 任务 进程:一个程序在运行时,系统会为其分配一个进程,用以管理他的一些资源. 线程:进程内所包含的一个或多个执行单元称为线程,线程一般情况下不持有资源,但可以使用其所在进程的资源. 任务:进程或线程中要做的事情. 在引入线程的操作系统中,通常把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位. 线程比进程更小,对其调度的开销小,能够提高系统内多个任务的并发执行程度. 一个程序至少有一个进程,一个进程至少有一个线程.一个程序就是一个进程,而一个程序中的多个任

多线程编程1-NSThread

前言 每个iOS应用程序都有个专门用来更新显示UI界面.处理用户触摸事件的主线程,因此不能将其他太耗时的操作放在主线程中执行,不然会造成主线程堵塞(出现卡机现象),带来极坏的用户体验.一般的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程编程是防止主线程堵塞,增加运行效率的最佳方法. iOS中有3种常见的多线程编程方法: 1.NSThread 这种方法需要管理线程的生命周期.同步.加锁问题,会导致一定的性能开销 2.NSOperation和NSOperationQueue 是基于OC

Android多线程编程(一)——多线程基础

什么是进程 一个进程是一个独立(self contained)的运行环境,它可以看作一个程序或者一个应用. 什么是线程 而线程是进程中执行的一个任务,Java运行环境是一个包含了不同累和程序的单一进程.线程可以被称为轻量级进程.线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源. Android线程 Android的线程,实际上和Java的多线程编程并没有什么本质上的不同.当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如