精华内容
下载资源
问答
  • 据我了解,我已经编写了简单的单线程和多线程程序,以检查执行速度.但是我的单线程程序执行速度比多线程程序要好,请看下面的程序,并提及是否有任何错误.单线程:import java.util.Calendar;public class NormalJava {...

    据我了解,我已经编写了简单的单线程和多线程程序,以检查执行速度.但是我的单线程程序执行速度比多线程程序要好,请看下面的程序,并提及是否有任何错误.

    单线程:

    import java.util.Calendar;

    public class NormalJava {

    public static void main(String[] args) {

    System.out.println("Single Thread");

    int a = 1000;

    int b = 200;

    NormalJava nj = new NormalJava();

    nj.Add(a, b);

    nj.Sub(a, b);

    nj.Mul(a, b);

    nj.Div(a, b);

    Calendar lCDateTime = Calendar.getInstance();

    System.out.println("Calender - Time in milliseconds :"

    + lCDateTime.getTimeInMillis());

    }

    private void Add(int a, int b) {

    System.out.println("Add :::" + (a + b));

    }

    private void Sub(int a, int b) {

    System.out.println("Sub :::" + (a - b));

    }

    private void Mul(int a, int b) {

    System.out.println("Mul :::" + (a * b));

    }

    private void Div(int a, int b) {

    System.out.println("Mul :::" + (a / b));

    }

    }

    输出:

    单线程

    添加::: 1200

    子:::800

    Mul ::: 200000

    Mul ::: 5

    日历 – 时间(毫秒):138 415 866 7863

    多线程程序:

    package runnableandcallable;

    import java.util.ArrayList;

    import java.util.Calendar;

    import java.util.List;

    import java.util.concurrent.Callable;

    import java.util.concurrent.ExecutionException;

    import java.util.concurrent.ExecutorService;

    import java.util.concurrent.Executors;

    import java.util.concurrent.Future;

    import java.util.concurrent.TimeUnit;

    import java.util.concurrent.TimeoutException;

    public class MainThread {

    private static ExecutorService service = Executors.newFixedThreadPool(10); // connection

    // pool

    @SuppressWarnings("unchecked")

    public static void main(String[] args) throws InterruptedException {

    System.out.println("Multithreading");

    MainThread mt = new MainThread();

    mt.testThread(1000, 200);

    Calendar lCDateTime = Calendar.getInstance();

    System.out.println("Calender - Time in milliseconds :"

    + lCDateTime.getTimeInMillis());

    }

    public void testThread(final int a, final int b) {

    // create a callable for each method

    Callable callableAdd = new Callable() {

    @Override

    public Void call() throws Exception {

    Add(a, b);

    return null;

    }

    };

    Callable callableSub = new Callable() {

    @Override

    public Void call() throws Exception {

    Sub(a, b);

    return null;

    }

    };

    Callable callableMul = new Callable() {

    @Override

    public Void call() throws Exception {

    Mul(a, b);

    return null;

    }

    };

    Callable callableDiv = new Callable() {

    @Override

    public Void call() throws Exception {

    Div(a, b);

    return null;

    }

    };

    // add to a list

    List> taskList = new ArrayList>();

    taskList.add(callableAdd);

    taskList.add(callableSub);

    taskList.add(callableMul);

    taskList.add(callableDiv);

    // create a pool executor with 3 threads

    ExecutorService executor = Executors.newFixedThreadPool(3);

    try {

    // start the threads

    List> futureList = executor.invokeAll(taskList);

    for (Future voidFuture : futureList) {

    try {

    // check the status of each future. get will block until the

    // task

    // completes or the time expires

    voidFuture.get(100, TimeUnit.MILLISECONDS);

    } catch (ExecutionException e) {

    System.err

    .println("Error executing task " + e.getMessage());

    } catch (TimeoutException e) {

    System.err.println("Timed out executing task"

    + e.getMessage());

    }

    }

    } catch (InterruptedException ie) {

    // do something if you care about interruption;

    }

    }

    private void Add(int a, int b) {

    System.out.println("Add :::" + (a + b));

    }

    private void Sub(int a, int b) {

    System.out.println("Sub :::" + (a - b));

    }

    private void Mul(int a, int b) {

    System.out.println("Multiply :::" + (a * b));

    }

    private void Div(int a, int b) {

    System.out.println("Division :::" + (a / b));

    }

    }

    多线程输出:

    多线程

    子:::800

    师::: 5

    添加::: 1200

    乘以::: 200000

    日历 – 时间(毫秒):138 415 868 0821

    这里单线程执行在138 415 866 7863毫秒,多线程执行在这138 415 868 0821毫秒.那么多线程的真正目的是什么?

    展开全文
  • 多线程从网上下载一个大文件为什么更快(比之单线程)?网上查了有人说“是因为io堵塞的原因,因为网速肯定快不过cpu,单线程单io通道,而多线程多io通道“ 。我理解他的意思是:单线程因为网速慢赶不上cpu的处理...
    多线程从网上下载一个大文件为什么要更快(比之单线程)?网上查了有人说“是因为io堵塞的原因,因为网速肯定快不过cpu,单线程单io通道,而多线程多io通道“ 。我理解他的意思是:单线程因为网速慢赶不上cpu的处理速度,所以造成大量的堵塞,而多线程多io通道,所以堵塞减少。我的疑问是:同一个多核处理器,io通道会随着线程的增加而一直增加吗?单线的一个io通道和多线程中每个io通道速度都是一样的吗?单线程为什么不能通过提升io通道的速度进而提快速度呢?难道是因为io通道是一个硬件?其速度是受限于硬件的?如果io通道是硬件的话,那么一个处理器的最大io通道个数是不是就是和其核数相等呢?如果真的是我上面猜想的,那么是不是可以认为,如果是单核处理器,通过时间片实现的多线程下载大文件并不能更快呢? 

    c6005dd93611febec98fa7c5e19dd891.png

    决定用户下载大文件速度快慢的终极因素,在于用户下载进程实时抢占网络带宽的大小。其它的因素与它相比,可以忽略不计。 实时最大可用带宽任意一个与互联网通信的进程,理论上都有一个实时最大可用带宽,这是客观存在,不以用户意志为转移。 如果 用户进程实时抢占的带宽 = 实时网络可用带宽 那是最最理想的,用户进程100%利用网络带宽,无论进程(Process)是单线程(Thread)的还是多线程的,下载速度几乎没有任何区别。 理想是丰满的,但现实是骨感的,因为:  用户进程实时抢占的带宽 ≤实时网络可用带宽     Forever!!!  既然如此,如果能让用户进程实时抢占的带宽无限接近实时网络可用带宽,那也是非常完美的。可是,实时网络带宽是多少? 没有人知道!实时网络可用带宽每一刻都在变化! 操作系统很愿意为用户效劳,TCP通过流量探测机制,不间断地探测实时网络可用带宽,并将实时的发送速率与之匹配(相等)起来,这个骚操作看起来很美! 为什么这么说呢?传统的TCP流量探测机制有一个非常致命的缺陷:一旦检测到有丢包,立马将发送速率降为1/2。降速1/2后,如果没有丢包,将会在1/2速率的基础上,按照固定的增长值(线性增长),加大发送的速率。接下来就会一直按照这个节奏到达丢包的那一刻(实时可用带宽)为止。然后再1/2降速,循环往复,直到文件下载结束。 如果下一个检测周期依然有丢包现象,会在当前1/2速率的基础上继续降速1/2。剩下的故事情节以此类推。 

    55de8cb13333b438b81cfe98647655d1.png

    很显然,指数级降速,线性增速,这很不公平!降速很快,但升速却很漫长!造成的直接恶果就是真实的传输速率远远小于实时可用带宽。 多线程Vs 单线程多线程相比单线程的优势是,由于有多个线程在竞争实时可用带宽。尽管多线程逻辑上是并行的,但其实还是按时序的串行处理。所以每个线程处于的阶段并不一致。 在任意时刻,有的线程处于丢包被罚1/2降速,有的线程处于2倍增速阶段(SlowStart),而有的线程处于线性增长阶段。通过多个线程的下载速率的加权平均,得到的是一根相对平滑的下载曲线。这条平滑曲线在大多数时候应该位于单线程下载速率的上方。这就是多线程下载速率更有优势的体现。 但是,如果TCP流量探测机制更加智能,比如BBR算法。BBR算法最大的进步,就是摒弃传统TCP流量调度算法(基于是否丢包而升速或降速), BBR采取的是,实时测量网络最大的可用带宽,并将发送速率与之相匹配,一直在实时可用带宽附近小范围徘徊,避免大起大落的情况发生。测量速率能无限接近实时可用带宽,多线程相比单线程,优势就体现不出来了。  如何成为专业的网络安全工程师?2020会员招募
    展开全文
  • 多线程从网上下载一个大文件为什么更快(比之单线程)?网上查了有人说“是因为io堵塞的原因,因为网速肯定快不过cpu,单线程单io通道,而多线程多io通道“ 。我理解他的意思是:单线程因为网速慢赶不上cpu的处理...
    多线程从网上下载一个大文件为什么要更快(比之单线程)?网上查了有人说“是因为io堵塞的原因,因为网速肯定快不过cpu,单线程单io通道,而多线程多io通道“ 。我理解他的意思是:单线程因为网速慢赶不上cpu的处理速度,所以造成大量的堵塞,而多线程多io通道,所以堵塞减少。我的疑问是:同一个多核处理器,io通道会随着线程的增加而一直增加吗?单线的一个io通道和多线程中每个io通道速度都是一样的吗?单线程为什么不能通过提升io通道的速度进而提快速度呢?难道是因为io通道是一个硬件?其速度是受限于硬件的?如果io通道是硬件的话,那么一个处理器的最大io通道个数是不是就是和其核数相等呢?如果真的是我上面猜想的,那么是不是可以认为,如果是单核处理器,通过时间片实现的多线程下载大文件并不能更快呢? 

    7130ae9b4ac7118305b31c992ed23409.png

    决定用户下载大文件速度快慢的终极因素,在于用户下载进程实时抢占网络带宽的大小。其它的因素与它相比,可以忽略不计。 实时最大可用带宽任意一个与互联网通信的进程,理论上都有一个实时最大可用带宽,这是客观存在,不以用户意志为转移。 如果 用户进程实时抢占的带宽 = 实时网络可用带宽 那是最最理想的,用户进程100%利用网络带宽,无论进程(Process)是单线程(Thread)的还是多线程的,下载速度几乎没有任何区别。 理想是丰满的,但现实是骨感的,因为:  用户进程实时抢占的带宽 ≤实时网络可用带宽     Forever!!!  既然如此,如果能让用户进程实时抢占的带宽无限接近实时网络可用带宽,那也是非常完美的。可是,实时网络带宽是多少? 没有人知道!实时网络可用带宽每一刻都在变化! 操作系统很愿意为用户效劳,TCP通过流量探测机制,不间断地探测实时网络可用带宽,并将实时的发送速率与之匹配(相等)起来,这个骚操作看起来很美! 为什么这么说呢?传统的TCP流量探测机制有一个非常致命的缺陷:一旦检测到有丢包,立马将发送速率降为1/2。降速1/2后,如果没有丢包,将会在1/2速率的基础上,按照固定的增长值(线性增长),加大发送的速率。接下来就会一直按照这个节奏到达丢包的那一刻(实时可用带宽)为止。然后再1/2降速,循环往复,直到文件下载结束。 如果下一个检测周期依然有丢包现象,会在当前1/2速率的基础上继续降速1/2。剩下的故事情节以此类推。 

    088c69f9872d97b7f5524c3a91e3de1e.png

    很显然,指数级降速,线性增速,这很不公平!降速很快,但升速却很漫长!造成的直接恶果就是真实的传输速率远远小于实时可用带宽。 多线程Vs 单线程多线程相比单线程的优势是,由于有多个线程在竞争实时可用带宽。尽管多线程逻辑上是并行的,但其实还是按时序的串行处理。所以每个线程处于的阶段并不一致。 在任意时刻,有的线程处于丢包被罚1/2降速,有的线程处于2倍增速阶段(SlowStart),而有的线程处于线性增长阶段。通过多个线程的下载速率的加权平均,得到的是一根相对平滑的下载曲线。这条平滑曲线在大多数时候应该位于单线程下载速率的上方。这就是多线程下载速率更有优势的体现。 但是,如果TCP流量探测机制更加智能,比如BBR算法。BBR算法最大的进步,就是摒弃传统TCP流量调度算法(基于是否丢包而升速或降速), BBR采取的是,实时测量网络最大的可用带宽,并将发送速率与之相匹配,一直在实时可用带宽附近小范围徘徊,避免大起大落的情况发生。测量速率能无限接近实时可用带宽,多线程相比单线程,优势就体现不出来了。  如何成为专业的网络安全工程师?2020会员招募
    展开全文
  • 多线程模型 每一个用户请求,申请一个单独的线程来处理 线程大部分时间使用0%的CPU等待数据库返回数据 必须每一个线程分配所需的内存(堆、栈) 单线程模型(Node.js) 每个请求会被丢进Node.js的事件循环中...

    更多内容请移步(首发于我的Github Blog)

    实际的Web服务工作模式

    • 后端依赖于数据库
    • 在等待数据库返回时,0%的cpu使用

    多线程模型

    • 为每一个用户请求,申请一个单独的线程来处理
    • 线程大部分时间使用0%的CPU等待数据库返回数据
    • 必须为每一个线程分配所需的内存(堆、栈)

    单线程模型(Node.js)

    • 每个请求会被丢进Node.js的事件循环中(理解Node.Js事件循环)
    • 不需要为每一个用户请求,申请一个线程,不需要进行大量的malloc,这样加快了执行效率
    • 当数据库(IO)请求返回数据后,事件循环触发响应给客户端

    总结

    • 多线程模型申请线程的成本是很高的
    • 申请内存,malloc是很慢的,分配大量的对象意味着会比单线程模型慢
    • 如果是CPU密集型的服务,单线程模型会更慢,因为单线程模式,只使用一个CPU内核,CPU密集运算会阻碍整个事件循环的效率
    展开全文
  • 下面是Python 2.7.9手册中对GIL的...去释放GIL锁,并查看其他线程是否可以执行,由于任务被加锁,会在第二个cpu时间片继续把时间片分给第一个线程,这会让cpu调度时间白白浪费,反而导致多线程比单线程耗时久。
  • 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程...为什么有时候线程数超过CPU内核数会更快呢? 原因是这种程序的单个线程运算量不足以占满CPU一个内核(比如存在大量IO操作,IO比较慢,是...
  • 记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于当时技术水平有限,我只能回答出如下两点:数据是存储在内存中的。Redis 是单线程的。当然,将数据存储在内存中,读取的时候不需要进行磁盘的 IO,单线程...
  • 为什么使用多线程

    2017-03-16 16:55:33
    1.耗时的操作使用线程,提高应用程序响应 2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。 3.多CPU系统中,使用线程... 使用多线程的理由之一是和进程相比,它是一种非常花销小,切换
  • 为什么这种python多线程方法要比单线程花费更多的时间来解决相同的问题?在我的电脑就是多核处理器。在我用两种方法编写了相同的代码,并进行了比较。令人惊讶的是单线程的方式更快!有人有什么想法吗?在#!/usr/bin...
  • 记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于当时技术水平有限,我只能回答出如下两点:数据是存储在内存中的。Redis 是单线程的。当然,将数据存储在内存中,读取的时候不需要进行磁盘的 IO,单线程...
  • 为什么使用多线程

    2017-01-12 14:15:16
    1.耗时的操作使用线程,提高应用程序响应 2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。 ... 使用多线程的理由之一是和进程相比,它是一种非常花销小,切换"节俭
  • 多线程就一定吗?天真!

    千次阅读 2019-12-31 09:18:14
    为什么多线程就不一定? 还是拿《多线程排序-真香!》中的程序举例,下面是各个线程数量的排序结果: 线程数 时间/s 1 2.393644 2 1.367392 3 ...
  • 小编典典我不知道何时应该在Java开发中使用多线程,以及使用它的逻辑/原因。在不同情况下如何提供帮助?您应出于多种原因将程序更改使用线程。该程序将以更快的速度运行并更好地利用您所运行的多个CPU /内核体系...
  • redis单线程为什么的个人解释

    千次阅读 2019-05-30 00:18:06
    不应该是多线程更快吗?那这是不是有什么矛盾啊? 答:啊???。。。。。。(心里卧槽,就是单线程所以快啊,还说多线程什么事,难道是我哪块的知识点出了问题了?) 对,这是一次真实的面试,没想到快被用烂的...
  • 为什么使用多线程?

    2014-11-20 14:33:01
    1.耗时的操作使用线程,提高应用程序响应2.并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求。... 使用多线程的理由之一是和进程相比,它是一种非常花销小,切换"节俭"的多任务操...
  • Redis采用的是基于内存的、单进程单线程模型的KV...为了好的回答和理解Redis为什么有这好的性能,我们从以下两个问题来解答: redis为什么这么? redis为什么选择单进程单线程模型? Redis为什么这么? ...
  • 如果我告诉您有一个 Redis 的分支版本,它的性能比原生的 Redis 5 倍,而且延迟却降低近 5 倍,你会不会想了解一下这个项目?而如果您不再需要哨兵节点并且您的...KeyDB 是 Redis 开源的多线程分叉版本。本文我...
  • 记得刚毕业那会参加面试,面试官会问我 Redis 为什么快,由于当时技术水平有限,我只能回答出如下两点:数据是存储在内存中的Redis 是单线程的当然,将数据存储在内存中,读取的时候不需要进行磁盘的 IO,单线程也...
  • 以前一直有个误区,以为:高性能服务器 一定是 多线程来实现的 ...在说这个事前希望大家都能对 CPU 、 内存 、 硬盘的速度都有了解了,这样可能理解得深刻一点,不了解的朋友点:CPU到底比内存跟硬盘多少 ...
  • 更简单,更快。 名字的由来是什么? 它表示螺纹,也表示“ Sil”。 Sil(韩语:실)在英语中表示“线程”。 而且,英文单词“ thread”是轻快的东西。 开始警告 SIL.js不支持在本地使用webpack基本框架。 请仔细...
  • 首先分配cpu资源的单位是进程。...多线程提高的是并发数量,执行的是不变的,比如现在有一个4核cpu的服务器,同一时间可执行4个线程,这样处理线程任务 的速度比较。但是多出来的线程,5个,6个,7个,...
  • 为什么说Redis是单线程的以及Redis为什么这么! 2018年03月08日 22:54:28萧曳丶阅读数:30675标签:NoSQLRedis更多 个人分类:NoSQLRedis 一、前言 近乎所有与Java相关的面试都会问到缓存的问题,基础一点的会...
  • redis理解 1.什么是redis?  redis是基于内存的也可以持久化的日志型、key-value数据库,是单线程的。...redis的使用场景连接非常但每个连接开销很少,而CPU切换线程的开销很大,所以单线程更合适。 redis

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 898
精华内容 359
关键字:

为什么多线程更快