多线程不是为了提高效率,而是不必等待
2016-11-16 10:47
316 查看
并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。
前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.
来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。
并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。 而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。 从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。多线程运行时,几个程序轮流运行,就像同时运行一样。
单CPU单核、纯计算、没IO的理想状态下,单个线程肯定比多个线程快,因为省去了线程切换的开销。但真实的环境基本都有IO操作,在 异步的业务场景下,我一般会使用线程池,至于线程池的线程数目配置为多少,有资料推荐为N×(1+IO耗时/完整的业务耗时),N是CPU核数。多线程并不是为了提高效率,而是不必等待 可以并行执行多条数据。
多线程:
线程是进程中的一个控制单元。
一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个控制单元。
并发运行。如:多线程下载软件。
可以完成同时运行,但是通过程序运行的结果发现,虽然同时运行,但是每一次结果都不一致。
因为多线程存在一个特性:随机性。
造成的原因:CPU在瞬间不断切换去处理各个线程导致的。
可以理解成多个线程在抢cpu资源。
如果在程序中创建一个新的控制单元呢?
Java对线程有自己描述,而且在调用系统资源。
该描述的类是Thread。只要创建Thread类的对象即可在内存中建立新的控制单元。
但是创建线程的目的是为了运行自定义的代码。
自定义的代码如何和多线程相结合呢?
通过start方法明确,线程是在执行run方法。
那么只要将线程需要运行的代码存入到run方法中即可。
只要继承Thread类并复写该run方法即可。
创建线程的第一种方式:继承Thread类;
1,定义Thread类的子类。创建子类对象,就是在内存中建立了控制单元。
2,复写Thread类中的run方法。将多线程要运行的代码存入其中。
3,调用线程Thread中的start方法开启线程,并让jvm运行run方法。
线程的四种状态:
1,被创建.new Thread类或者Thread类的子类对象。
2,通过start方法,让线程进入到了运行状态。
3,线程存活的情况,可以不运行,因为到了冻结状态。
4,消亡,线程执行的代码结束。
如何获取当前线程对象呢?
通过Thread类中的静态方法:Thread currentThread()。
获取线程的名称 getName():默认是Thread-编号。
什么时候需要多线程呢?
当多部分代码需要同时运行时,就需要使用多线程技术。
聊天软件的例子。发送区域和接收数据区域就是同时运行的。
两种创建方式:
1,继承Thread类。复写run方法,通过start方法开启线程。并让jvm调用run方法。
2,实现Runnable接口;
2.1定义类实现Runnable接口。
2.2复写接口中run方法。
2.3通过Thread类建立线程对象。
2.4将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。
目的:让线程可以执行执行的接口子类的run方法。
2.5调用Thread类的start方法开启线程。
这两种方式区别:
线程代码存放的位置不同,一个存放在Thread类的子类中。一个存在Runnable接口的子类中。
第二种方式有什么好处呢?
1,将资源对多线程共享。
2,避免了单继承的局限性。
转载:http://blog.chinaunix.net/uid-26602509-id-3134808.html
前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.
来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。
并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。 而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。 从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。多线程运行时,几个程序轮流运行,就像同时运行一样。
单CPU单核、纯计算、没IO的理想状态下,单个线程肯定比多个线程快,因为省去了线程切换的开销。但真实的环境基本都有IO操作,在 异步的业务场景下,我一般会使用线程池,至于线程池的线程数目配置为多少,有资料推荐为N×(1+IO耗时/完整的业务耗时),N是CPU核数。多线程并不是为了提高效率,而是不必等待 可以并行执行多条数据。
多线程:
线程是进程中的一个控制单元。
一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个控制单元。
并发运行。如:多线程下载软件。
可以完成同时运行,但是通过程序运行的结果发现,虽然同时运行,但是每一次结果都不一致。
因为多线程存在一个特性:随机性。
造成的原因:CPU在瞬间不断切换去处理各个线程导致的。
可以理解成多个线程在抢cpu资源。
如果在程序中创建一个新的控制单元呢?
Java对线程有自己描述,而且在调用系统资源。
该描述的类是Thread。只要创建Thread类的对象即可在内存中建立新的控制单元。
但是创建线程的目的是为了运行自定义的代码。
自定义的代码如何和多线程相结合呢?
通过start方法明确,线程是在执行run方法。
那么只要将线程需要运行的代码存入到run方法中即可。
只要继承Thread类并复写该run方法即可。
创建线程的第一种方式:继承Thread类;
1,定义Thread类的子类。创建子类对象,就是在内存中建立了控制单元。
2,复写Thread类中的run方法。将多线程要运行的代码存入其中。
3,调用线程Thread中的start方法开启线程,并让jvm运行run方法。
线程的四种状态:
1,被创建.new Thread类或者Thread类的子类对象。
2,通过start方法,让线程进入到了运行状态。
3,线程存活的情况,可以不运行,因为到了冻结状态。
4,消亡,线程执行的代码结束。
如何获取当前线程对象呢?
通过Thread类中的静态方法:Thread currentThread()。
获取线程的名称 getName():默认是Thread-编号。
什么时候需要多线程呢?
当多部分代码需要同时运行时,就需要使用多线程技术。
聊天软件的例子。发送区域和接收数据区域就是同时运行的。
两种创建方式:
1,继承Thread类。复写run方法,通过start方法开启线程。并让jvm调用run方法。
2,实现Runnable接口;
2.1定义类实现Runnable接口。
2.2复写接口中run方法。
2.3通过Thread类建立线程对象。
2.4将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。
目的:让线程可以执行执行的接口子类的run方法。
2.5调用Thread类的start方法开启线程。
这两种方式区别:
线程代码存放的位置不同,一个存放在Thread类的子类中。一个存在Runnable接口的子类中。
第二种方式有什么好处呢?
1,将资源对多线程共享。
2,避免了单继承的局限性。
转载:http://blog.chinaunix.net/uid-26602509-id-3134808.html
相关文章推荐
- 多线程不是为了提高效率,而是不必等待
- 努力和上进不是为了做给别人看,而是为了不辜负自己
- 工作流程是为了提高工作效率吗?
- C# 多线程、控制线程数提高循环输出效率
- JAVA多线程,真的能提高效率吗
- 自动化测试更适合缺陷预防,而不是提高测试效率
- 多线程误区:一定会提高效率
- 人活着不是为了迎合别人的认同,而是追求自我的肯定。
- 【读书笔记】《Scum要素》-团队成员不是为了完成自己的工作,而是工作
- java多线程(七)提高锁的效率——使用读写锁
- java多线程(七)提高锁的效率——使用读写锁
- lucene-利用内存中索引和多线程提高索引效率
- C# 多线程、控制线程数提高循环输出效率
- 关于多线程io能否提高程序效率
- 人在做坏事的时候,总希望给自己找理由。这些理由,也许虚伪,也许可笑,但并不是为了说服别人,而是说服自己。
- 代码自动生成 --- 一切都为了提高您的工作效率,和苦逼码农说NO
- C++ windows多线程 线程描述了进程内代码的执行路径。进程中同时可以有多个线程在执行,为了使他们能够同时运行,操作系统为每个线程轮流分配CPU时间片,为了充分地利用CPU提高软件产品的性能,一
- 01本文摘要 —————— “袋鼠云企业服务的目的不是帮助企业上云,而是帮助企业在云上找到新的创新点,改变过去旧的生产和工作模式,通过云计算这种新的模式,来创新,突破,提升效率。进而,以点带面
- 读书、看电视应该身临其境去读、去看(不是为了娱乐,而是为了对人生有帮助)(三次反省,都想到了这个问题)
- 多线程写文件是否提高效率?