多线程不是为了提高效率,而是不必等待

并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。

前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.
来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头。


并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。  而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。  从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。多线程运行时,几个程序轮流运行,就像同时运行一样。

单CPU单核、纯计算、没IO的理想状态下,单个线程肯定比多个线程快,因为省去了线程切换的开销。但真实的环境基本都有IO操作,在 异步的业务场景下,我一般会使用线程池,至于线程池的线程数目配置为多少,有资料推荐为N×(1+IO耗时/完整的业务耗时),N是CPU核数。多线程并不是为了提高效率,而是不必等待 可以并行执行多条数据。 

  1. 多线程:   
  2.     线程是进程中的一个控制单元。   
  3.     一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个控制单元。   
  4.     并发运行。如:多线程下载软件。   
  5.        
  6.     可以完成同时运行,但是通过程序运行的结果发现,虽然同时运行,但是每一次结果都不一致。   
  7.   
  8.   
  9.     因为多线程存在一个特性:随机性。   
  10.     造成的原因:CPU在瞬间不断切换去处理各个线程导致的。   
  11.     可以理解成多个线程在抢cpu资源。   
  12.   
  13.     如果在程序中创建一个新的控制单元呢?   
  14.   
  15.     Java对线程有自己描述,而且在调用系统资源。   
  16.     该描述的类是Thread。只要创建Thread类的对象即可在内存中建立新的控制单元。   
  17.   
  18.     但是创建线程的目的是为了运行自定义的代码。   
  19.     自定义的代码如何和多线程相结合呢?   
  20.     通过start方法明确,线程是在执行run方法。   
  21.     那么只要将线程需要运行的代码存入到run方法中即可。   
  22.     只要继承Thread类并复写该run方法即可。   
  23.   
  24.     创建线程的第一种方式:继承Thread类;   
  25.     1,定义Thread类的子类。创建子类对象,就是在内存中建立了控制单元。   
  26.     2,复写Thread类中的run方法。将多线程要运行的代码存入其中。   
  27.     3,调用线程Thread中的start方法开启线程,并让jvm运行run方法。   
  28.   
  29.     线程的四种状态:   
  30.     1,被创建.new Thread类或者Thread类的子类对象。   
  31.     2,通过start方法,让线程进入到了运行状态。   
  32.     3,线程存活的情况,可以不运行,因为到了冻结状态。   
  33.     4,消亡,线程执行的代码结束。   
  34.   
  35.     如何获取当前线程对象呢?   
  36.     通过Thread类中的静态方法:Thread currentThread()。   
  37.     获取线程的名称 getName():默认是Thread-编号。   
  38.     
  39.     什么时候需要多线程呢?   
  40.     当多部分代码需要同时运行时,就需要使用多线程技术。   
  41.     聊天软件的例子。发送区域和接收数据区域就是同时运行的。
  42. 两种创建方式:   
  43.     1,继承Thread类。复写run方法,通过start方法开启线程。并让jvm调用run方法。   
  44.     2,实现Runnable接口;   
  45.         2.1定义类实现Runnable接口。   
  46.         2.2复写接口中run方法。   
  47.         2.3通过Thread类建立线程对象。   
  48.         2.4将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数。   
  49.             目的:让线程可以执行执行的接口子类的run方法。   
  50.         2.5调用Thread类的start方法开启线程。   
  51.        
  52.     这两种方式区别:   
  53.     线程代码存放的位置不同,一个存放在Thread类的子类中。一个存在Runnable接口的子类中。   
  54.   
  55.     第二种方式有什么好处呢?   
  56.     1,将资源对多线程共享。   
  57.     2,避免了单继承的局限性。  
  58. 转载:http://blog.chinaunix.net/uid-26602509-id-3134808.html

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值