多线程和应用

多线程和应用

1. 什么是多线程

多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个执行绪,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器

2. 多线程的优点:

  1. 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  3. 程序的运行速度可能加快
  4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

3. 线程一些重要概念

每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
每个线程都有他自己的一组CPU寄存器,称为线程的上下文,该上下文反映了线程上次运行该线程的CPU寄存器的状态。
指令指针和堆栈指针寄存器是线程上下文中两个最重要的寄存器,线程总是在进程得到上下文中运行的,这些地址都用于标志拥有线程的进程地址空间中的内存。
线程可以被抢占(中断)。
在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) – 这就是线程的退让。

4. 多线程与多进程和单进程多线程的弊端

每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程.
线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
可以这样通俗的讲:
1.单进程单线程:一个人在一个桌子上吃菜。
2.单进程多线程:多个人在同一个桌子上一起吃菜。
3.多进程单线程:多个人每个人在自己的桌子上吃菜。
多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了。此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢。
这个所谓的争抢就会导致单进程多线程最后的运算结果的不可预测性。所以,我们在编多线程程序时,尤其要注意规避这一点。

4. 多线程的应用

多线程的应用其实很广泛,因为多线程有以下两个优点,只要你考虑到了这两个优点,都可以使用多线程。
• 想要同时处理多件事:单线程处理不了的,必须使用多线程。(类似于分身术)
• 多个线程分解大任务:用单线程可以做,但是使用多线程可以更快。(类似于左右开弓)
常见的有,你在网页上播放一个视频,你要同时处理声音和图像。这时候你就需要多线程。比如你要实现一个聊天室,也是需要的。下面讲几个不常见的例子。

1. Servlet和JSP技术

Servlet容器创建多个线程,在这些线程中执行servlet请求。在你写servlet程序时,你不需要知道你的servlet请求是在什么线程中执行的。但是你要知道,如果同时有多个对相同URL的请求入栈,那么同一个servlet可能会同时在多个线程中是活动的。这要求我们再编写servlet或jsp时,必须始终假设可以在多个线程中并发地执行同一个servlet或jsp的情境,这就要求我们必须适当同步servlet或jsp文件访问的任何共享数据,包括servlet对象本身的字段。

2. 现实RMI对象

RMI让你可以调用在其他JVM中运行的对象并对其进行操作。当调用远程方法时,RMI编译器创建的RMI存根会打包方法参数,并通过网络警它们发送到远程系统,然后远程系统会将它们解包并调用远程方法。
假设你创建了一个RMI对象,并将它注册到RMI注册表或者JNDI名称空间(Java Naming and Directory Interface即Java命名和目录接口)。当远程客户机调用其中的一个方法是,该方法会在什么线程中执行呢?假设RMI对象的常用方法是继承UnicastRemoteObject,在构造UnicastRemoteObject时,会初始化用于分派远程方法调用的基础结构,这包括用于接收远程调用请求的套接字侦听器和一个或多个执行远程请求的线程。所以,当接收到执行RMI方法的请求时,这些方法将在RMI管理的线程中执行。

3. Collection集合类

Collection集合类在自身实现时并没有使用同步,这就意味着程序员在使用集合类时,在多线程的情境下如果没有进行同步,是有可能出问题的,即不能在不进行同步的情况下在多线程场景下使用集合类。通过每次访问共享集合中的方法时使用同步,可以在多线程应用程序中使用Collection类。对于任何给定的集合,每次必须用同一个锁进行同步。通常可以选择集合对象本身作为锁。另一种方法是使用Collections类提供的一组List、Map、Set的封装器。如可以用Collections.synchronizedMap封装Map,它将确保所有对该映射的访问都被正确同步了。

参考:
1.https://zh.wikipedia.org/wiki/%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8_(Windows%E5%85%83%E4%BB%B6)
2. https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%BA%BF%E7%A8%8B
3. 《操作系统原理》
4. http://www.kerneltravel.net/journal/iv/syscall.htm
5. http://blog.csdn.net/yusiguyuan/article/details/23181327
6. http://wenku.baidu.com/view/3e99ead6195f312b3169a580.html
7. http://www.zhihu.com/question/19901763
8. http://baike.baidu.com/view/65706.htm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值