精华内容
下载资源
问答
  • 多线程的优点提高资源利用率如读取一个目录下的所有文件,如果采用单线程模型,则从磁盘读取文件的时候,大部分CPU用于等待磁盘去读取数据。如果是采用多线程并发执行,则CPU可以在等待IO的时候去做其他的事情,以...

    多线程的优点提高资源利用率

    如读取一个目录下的所有文件,如果采用单线程模型,则从磁盘读取文件的时候,大部分CPU用于等待磁盘去读取数据。如果是采用多线程并发执行,则CPU可以在等待IO的时候去做其他的事情,以提高CPU的使用率,减少资源的浪费。程序响应速度好

    单线程模型下,假设一个http请求需要占用大量的时间来处理,则其他的请求无法发送请求给服务端。而多线程模式下,监听线程把请求传递给工作者线程,然后立刻返回去监听,可以去接收新的请求,而工作者线程则能够处理这个请求并发送一个回复给客户端。明显响应速度比单线程模型要好得多。

    多线程的缺点程序设计复杂度

    多线程情况下,需要考虑线程间的通信、共享资源的访问,相对而言要比单线程程序负责一些。上下文切换开销大

    当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”。CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。尤其是当线程数量较多时,这种开销很明显。资源消耗

    线程在运行的时候需要从计算机里面得到一些资源。除了CPU,线程还需要一些内存来维持它本地的堆栈。它也需要占用操作系统中一些资源来管理线程

    YUKX优科学习网

    本文内容及图片来源于网上摘录或读者投稿

    展开全文
  • 由于多线程应用程序将程序划分成多个独立任务,因此可以在以下方面显著提高性能:: (1)多线程技术使程序响应速度更快,因为用户界面可以在进行其它工作同时一直处于活动状态。 (2)当前空闲任务可以将处理器...

    由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能:

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

    (2)当前空闲的任务可以将处理器时间让给其它任务。

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

    (4)可以随时停止任务。

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

    在以下情况,最适合采用多线程处理:

    (1)耗时或大量占用处理器的任务阻塞用户界面操作

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

    多线程的主要缺点包括:

    (1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源,如打印机等。

    (2)对线程进行管理要求额外的CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点就会主要表现在其缺点上,比如用多个线程来更新数组内每个元素。

    (3)线程的死锁,即较长时间的等待或资源竞争以及死锁等多线程症状。

    (4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误是程序员无法预知的。

    展开全文
  • 为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等 多线程的好处: 1.使用线程...

    首先说下多线程出现的原因:

    为了解决负载均衡问题,充分利用CPU资源.为了提高CPU的使用率,采用多线程的方式去同时完成几件事情而不互相干扰.为了处理大量的IO操作时或处理的情况需要花费大量的时间等等,比如:读写文件,视频图像的采集,处理,显示,保存等

    多线程的好处:

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

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

    3.程序的运行效率可能会提高

    4.在一些等待的任务实现上如用户输入,文件读取和网络收发数据等,线程就比较有用了.

    多线程的缺点:

    1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换.

    2.更多的线程需要更多的内存空间

    3.线程中止需要考虑对程序运行的影响.

    4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生

    第三部分---------------Java中的线程------------------

    1、        什么是进程?

    答案:进程其实就是一个静态的概念。在机器上实际上运行的都是线程(线程,进程的一部分。)

    2、        什么是线程?

    答案:线程是一个程序内部的顺序控制流。一个进程里面有一个主方法叫main方法。是一个进程里面不同的执行路径。

    3、        什么时候会用到线程?

    答案:当系统中或者开发中。遇到高并发    并行的情况下为了解决负载均衡的问题,就会使用到线程。线程可以提高cpu的利用率。

    4、        在一个时间点上。Cpu只能支持一个线程的运行(由于windows在一个进程中将多个线程执行速度非常的快。所以好多人认为是那是多线程。其实在同一个时间点上只有一个线程在运行)。

    5、        注意:真正的多线程就是当你的机器为双cpu或者是双核的。那么这个时候确实是真正的多线程在运行。

    6、        Java的线程是通过java.long.thread类来实现的。

    7、        一个新的线程需要两步来执行@创建线程@启动线程

    8、        如何创建一个新的新的线程呢?

    答案:Thread  t=new Thread();每创建一个新的thread对象就相当于创建了一个新的线程。

    A)       Thread里面一个特殊的方法run();这个方法就是为执行一个线程而做准备的(当你创建了一个新的线程以后,所有实现的业务逻辑全部在run()方法里面),也就是说在run()方法里面写啥业务。线程就执行实现啥业务。

    B)       启动一个线程用start()方法,也就是说当调用Start()方法线程准备就绪以后。才能去启动执行run()方法里面的所有业务逻辑。、

    C)       总结:进程有独立的运行内存和空间。而线程是进程的一个执行单元。相同的线程是共享内存空间的。所以进程运行上对内存的开销比较大。而线程比较节省内存。

    D)       Therad线程类提供了好多方法。最常用的有sleep()方法,调用此方法是让一个线程处于睡眠状态。它是Thread类的一个静态方法。

    E)        注意:sleep()在使用过程中会抛出异常。当在处理异常的时候用try{}catch{}。当重写的方法无法用throws来处理异常时。就必须用try{}catch{}来处理异常。

    F)        如何结束一个线程?调用方法shutDown()方法。可以定义一个变量。比如:boolean flag=true;将变量变为false不就停止了吗?

    G)       Thread类的join()方法——合并某个线程。

    H)       Yield()方法,让出cpu让其他线程执行的机会。

    I)          线程的优先级:setPriority();用此方法就是设置线程的优先级。

     

    9、        线程同步:多个线程同时访问同一资源时。线程与线程之间协调的这一过程就叫做线程同步。

    A)  synchronized ()方法,指同步方法的意思。锁定线程。同步方法实际就是在执行方法的时候当前的对象呗锁定。(锁定方法实际就是锁定了当前方法的对象。必须等当前线程执行完才能执行下一个线程),线程的同步也就是使线程处于安全化状态。

    B)    线程的死锁:两个线程相互等待的状态就形成了死锁。

    C)   如何解决死锁:减小锁的粒度




    展开全文
  • 为什么要用到并发一直以来,硬件发展极其迅速,也有一个很著名"摩尔定律",可能会奇怪明明讨论是并发编程为什么会扯到了硬件发展,这其中关系应该是多核CPU发展为并发编程提供硬件基础。摩尔定律并...
    db8c1420f581c2111100a2714a1e381c.png

    欢迎关注头条号:Java小野猫

    1. 为什么要用到并发

    一直以来,硬件的发展极其迅速,也有一个很著名的"摩尔定律",可能会奇怪明明讨论的是并发编程为什么会扯到了硬件的发展,这其中的关系应该是多核CPU的发展为并发编程提供的硬件基础。摩尔定律并不是一种自然法则或者是物理定律,它只是基于认为观测数据后,对未来的一种预测。按照所预测的速度,我们的计算能力会按照指数级别的速度增长,不久以后会拥有超强的计算能力,正是在畅想未来的时候,2004年,Intel宣布4GHz芯片的计划推迟到2005年,然后在2004年秋季,Intel宣布彻底取消4GHz的计划,也就是说摩尔定律的有效性超过了半个世纪戛然而止。但是,聪明的硬件工程师并没有停止研发的脚步,他们为了进一步提升计算速度,而不是再追求单独的计算单元,而是将多个计算单元整合到了一起,也就是形成了多核CPU。短短十几年的时间,家用型CPU,比如Intel i7就可以达到4核心甚至8核心。而专业服务器则通常可以达到几个独立的CPU,每一个CPU甚至拥有多达8个以上的内核。因此,摩尔定律似乎在CPU核心扩展上继续得到体验。因此,多核的CPU的背景下,催生了并发编程的趋势,通过并发编程的形式可以将多核CPU的计算能力发挥到极致,性能得到提升。

    顶级计算机科学家Donald Ervin Knuth如此评价这种情况:在我看来,这种现象(并发)或多或少是由于硬件设计者无计可施了导致的,他们将摩尔定律的责任推给了软件开发者。

    另外,在特殊的业务场景下先天的就适合于并发编程。比如在图像处理领域,一张1024X768像素的图片,包含达到78万6千多个像素。即时将所有的像素遍历一边都需要很长的时间,面对如此复杂的计算量就需要充分利用多核的计算的能力。又比如当我们在网上购物时,为了提升响应速度,需要拆分,减库存,生成订单等等这些操作,就可以进行拆分利用多线程的技术完成。面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分 。正是因为这些优点,使得多线程技术能够得到重视,也是一名CS学习者应该掌握的:

    • 充分利用多核CPU的计算能力;
    • 方便进行业务拆分,提升应用性能

    2. 并发编程有哪些缺点

    多线程技术有这么多的好处,难道就没有一点缺点么,就在任何场景下就一定适用么?很显然不是。

    2.1 频繁的上下文切换

    时间片是CPU分配给各个线程的时间,因为时间非常短,所以CPU不断通过切换线程,让我们觉得多个线程是同时执行的,时间片一般是几十毫秒。而每次切换时,需要保存当前的状态起来,以便能够进行恢复先前状态,而这个切换时非常损耗性能,过于频繁反而无法发挥出多线程编程的优势。通常减少上下文切换可以采用无锁并发编程,CAS算法,使用最少的线程和使用协程。

    • 无锁并发编程:可以参照concurrentHashMap锁分段的思想,不同的线程处理不同段的数据,这样在多线程竞争的条件下,可以减少上下文切换的时间。
    • CAS算法,利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换
    • 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态
    • 协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

    由于上下文切换也是个相对比较耗时的操作,所以在"java并发编程的艺术"一书中有过一个实验,并发累加未必会比串行累加速度要快。 可以使用Lmbench3测量上下文切换的时长 vmstat测量上下文切换次数

    2.2 线程安全

    多线程编程中最难以把握的就是临界区线程安全问题,稍微不注意就会出现死锁的情况,一旦产生死锁就会造成系统功能不可用。

    22159178efd05984701c66ea0f325998.gif
    public class DeadLockDemo { private static String resource_a = "A"; private static String resource_b = "B"; public static void main(String[] args) { deadLock(); } public static void deadLock() { Thread threadA = new Thread(new Runnable() { @Override public void run() { synchronized (resource_a) { System.out.println("get resource a"); try { Thread.sleep(3000); synchronized (resource_b) { System.out.println("get resource b"); } } catch (InterruptedException e) { e.printStackTrace(); } } } }); Thread threadB = new Thread(new Runnable() { @Override public void run() { synchronized (resource_b) { System.out.println("get resource b"); synchronized (resource_a) { System.out.println("get resource a"); } } } }); threadA.start(); threadB.start(); }}
    22159178efd05984701c66ea0f325998.gif

    在上面的这个demo中,开启了两个线程threadA, threadB,其中threadA占用了resource_a, 并等待被threadB释放的resource _b。threadB占用了resource _b正在等待被threadA释放的resource _a。因此threadA,threadB出现线程安全的问题,形成死锁。同样可以通过jps,jstack证明这种推论:

    22159178efd05984701c66ea0f325998.gif
    "Thread-1": waiting to lock monitor 0x000000000b695360 (object 0x00000007d5ff53a8, a java.lang.String), which is held by "Thread-0""Thread-0": waiting to lock monitor 0x000000000b697c10 (object 0x00000007d5ff53d8, a java.lang.String), which is held by "Thread-1"Java stack information for the threads listed above:==================================================="Thread-1": at learn.DeadLockDemo$2.run(DeadLockDemo.java:34) - waiting to lock <0x00000007d5ff53a8(a java.lang.String) - locked <0x00000007d5ff53d8(a java.lang.String) at java.lang.Thread.run(Thread.java:722)"Thread-0": at learn.DeadLockDemo$1.run(DeadLockDemo.java:20) - waiting to lock <0x00000007d5ff53d8(a java.lang.String) - locked <0x00000007d5ff53a8(a java.lang.String) at java.lang.Thread.run(Thread.java:722)Found 1 deadlock.
    22159178efd05984701c66ea0f325998.gif

    如上所述,完全可以看出当前死锁的情况。

    那么,通常可以用如下方式避免死锁的情况:

    1. 避免一个线程同时获得多个锁;
    2. 避免一个线程在锁内部占有多个资源,尽量保证每个锁只占用一个资源;
    3. 尝试使用定时锁,使用lock.tryLock(timeOut),当超时等待时当前线程不会阻塞;
    4. 对于数据库锁,加锁和解锁必须在一个数据库连接里,否则会出现解锁失败的情况

    所以,如何正确的使用多线程编程技术有很大的学问,比如如何保证线程安全,如何正确理解由于JMM内存模型在原子性,有序性,可见性带来的问题,比如数据脏读,DCL等这些问题(在后续篇幅会讲述)。而在学习多线程编程技术的过程中也会让你收获颇丰。

    3. 应该了解的概念

    3.1 同步VS异步

    同步和异步通常用来形容一次方法调用。同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。比如,在超时购物,如果一件物品没了,你得等仓库人员跟你调货,直到仓库人员跟你把货物送过来,你才能继续去收银台付款,这就类似同步调用。而异步调用了,就像网购,你在网上付款下单后,什么事就不用管了,该干嘛就干嘛去了,当货物到达后你收到通知去取就好。

    3.2 并发与并行

    并发和并行是十分容易混淆的概念。并发指的是多个任务交替进行,而并行则是指真正意义上的“同时进行”。实际上,如果系统内只有一个CPU,而使用多线程时,那么真实系统环境下不能并行,只能通过切换时间片的方式交替进行,而成为并发执行任务。真正的并行也只能出现在拥有多个CPU的系统中。

    3.3 阻塞和非阻塞

    阻塞和非阻塞通常用来形容多线程间的相互影响,比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞,而非阻塞就恰好相反,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。

    3.4 临界区

    临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每个线程使用时,一旦临界区资源被一个线程占有,那么其他线程必须等待。

    欢迎做Java的朋友们私信我【资料】免费获取免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

    其中覆盖了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,很值得大家借鉴和学习,扩展自己的技术广度和知识面。

    展开全文
  • 首先,从定义开始,先看一下教科书上 进程和线程定义:进程:资源分配最小单位。线程:程序执行最小单位。 心中默念,啥啥啥,写这是啥。1进程进程是程序执行时一个实例,即它是程序已经执行到课中程度...
  • 小编是一名而立之年大龄儿童,在IT界摸爬滚打已经有11年有余,最近趁清闲之余给大家分享一些我在工作中一些心得个人总结给大家借鉴参考。。。今天来给大家讲解一下Python一些模块缺点:首先大家要知道...
  • 学习主题:IO流学习目标:掌握序列化反序列化掌握装饰器模式对象流为什么需要序列化?答:因为远程通信数据都是以二进制序列形式在网络上传输。当我们在网络上直接发送java对象。发送方需要把java对象转换为...
  • 线程的优点 1.发挥多核CPU强大处理能力 2.业务处理建模的简单性 通过使用线程,可以将复杂且异步的工作流进一步分解为一组简单并同步的工作流,每个工作流在一个单独的线程中运行,并在特定的同步位置进行交互。 ...
  • 尽管面临很多挑战,多线程有一些优点使得它一直被使用。这些优点是:  ● 资源利用率更好  ● 程序设计在某些情况下更简单  ● 程序响应更快  资源利用率更好  想象一下,一个应用程序需要从本地文件系统中读取...
  • 最近有个任务涉及到多线程编程,就在网上了解了一些多线程的相关内容,总结如下。  优势: ·在一些需要等待的任务实现上如用户输入、文件读写网络收发数据等,线程就比较有用了。在这种情况下可以释放一些...
  • 笔记出自朱有鹏老师课堂 ...1、进程实现同时读取鼠标键盘 进程可以实现并发 进程劣势: 进程切换开销大; 进程间通信麻烦、效率低 2、线程 优点任务; 解决进程两个缺点; 在多核CPU上更有优势。 ...
  • 三、多核处理器的优点和缺点从应用需求上去看,越来越的用户在使用过程中都会涉及到任务应用环境,日常应用中用到的非常典型的有两种应用模式。一种应用模式是一个程序采用了线程级并行编程,那么这个程序在运行...
  • 单线程和多线程的缺点

    千次阅读 2018-08-23 12:58:55
    单线程和多线程的缺点   单线程和多线程的缺点 多线程处理的优点 同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的...
  • 多线程优点: 线程间通信更加灵活方便:全局变量以及函数传参都是共用一个虚拟地址空间,只要知道地址就能访问同一块空间 线程的创建销毁成本更低:创建线程,也...多线程的优点就是多进程的缺点,多进程的优点就
  • 多线程的优点二.多进程的优点 目录: 对于问多进程多线程之间的差别的问题,其实我们只要表明我们所知道的多进程多线程各自的优点就可以了. 一.多线程的优点 1. 线程间通信会更加灵活 (包括进程间通信在内还可以...
  • Java多线程多进程的对比1、多进程(1)多进程的优点(2)多进程的缺点2、多线程(1)多线程的优点(2)多线程的缺点 1、多进程 当前的操作系统都是多任务OS。每个独立执行的任务就是一个进程。 操作系统OS将时间...
  • Linux多进程和多线程的缺点

    千次阅读 2017-09-15 17:54:05
    多线程的优点:1)它是一种非常”节俭”的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段数据段,这是一种”昂贵”的多任务工作方式。而...
  • 1. 进程的优点 顺序程序的特点:具有封闭性和可再现性; 程序的并发执行资源共享。道程序设计出现后,实现了程序的并发执行资源共享,提高了系统的效率系统的资源利用率。 2. 进程的缺点 操作系统调度...
  • 多线程处理的优点同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。多线程处理可以...
  • 并发编程的优点 1,从资源利用率的角度考虑,并发编程可以提高系统的资源利用率,最常见的是等待IO或等待HTTP返回与CPU资源浪费的矛盾。在并发的程序中CPU可以在等待这些低速设备时运行程序中的并发部分,这可以...
  • 多线程的缺点

    2020-07-26 17:19:52
    线程的优点 进程相比,它是一种非常"节俭"的任务操作方式。 对进程而言,创建一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段数据段,这是一种"昂贵"的任务工作方式。 ...
  • 最近做HBase项目有一块涉及到Java的多线程安全的问题,于是回顾了一下java多线程的东西,看了多篇多线程的写的比较好的文章之后,对这一块的...三、 多线程的优点和缺点 1. 优点 2. 缺点 四、 多线程并行 &am...
  • 优点: 多线程对资源需求少,创建代价比进程小 缺点:调试困难,非常容易出错   线程拥有独立程序计数器,独立栈空间,共享进程全局内存堆内存,共享文件描述符,共享虚拟内存。继承信号处理可以...
  • 基于进程服务器的优点: 1.由操作系统进行调度,运行比较稳定强壮 2.能够方便地通过操作系统进行监控管理 例如对每个进程的内存变化状况,甚至某个进程处理什么web请求进行监控.同时可以通过给进程发送信号量...
  • 线程、进程、多线程、多进程 多任务 小结

    千次阅读 多人点赞 2019-04-20 11:59:56
    目录 1 进程 2 线程 3 多进程 4 多线程 5 线程与进程的关系 ...6 线程进程的区别 ...9.1 多线程的优点 9.2 多线程的缺点 10多进程的优缺点 10.1 多进程的优点 10.2 多进程的缺点 8 多任务(多进...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,074
精华内容 429
关键字:

多线程的优点和缺点