记录多线程学习之路

线程的基本概念、基本状态及状态之间的关系?

线程的基本概念:线程指在程序执行过程中,能够执行程序代码的一个执行单元,每个程序至少有一个线程就是它本身。

线程的基本状态:就绪、运行、synchronize阻塞、wait和sleep挂起、结束。

状态之间的关系:wait要在synchronize中执行,对于wait来说有两种方式运行线程:wait()要使用notify()进行唤醒; wait(时间)是等待多长时间然后运行。

sleep是等待多长时间然后运行;


对于wait和sleep它俩的区别:wait是等待时不占用cpu。而sleep是等待时占用cpu。你也可以理解为wait是等待使用cpu。


调用线程的start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当synchronized获得锁后,由阻塞转为运行,在这种情况可以调用wait方法转为挂起状态,当线程关联的代码执行完后,线程变为结束状态。


线程和进程之间的区别: 对于进程来说,它就像是运行在电脑上的一个软件,那么一个软件的执行不可能是一条逻辑执行的,必定会有多个分支和多个程序段,所以会分成a,b,c等多个块组成这个程序。当程序运行的时候,CPU加载上下文,开始执行程序中的a程序块,然后执行b程序块,然后执行c程序块等,最后CPU保存整个程序的上下文。

这里你可以就理解了 a 、b 、c等 的执行时共享程序的上下文, 对于线程来说呢,a、b、c 就是线程了,他共享着进程的上下文环境。


实现多线程的方法有几种方式?

目前来说我知道的是三种:继承Thread,实现Runnable,使用线程池

对于继承Thread和实现Runnable两种方式,他们有什么区别呢?

一般来说建议使用 实现Runnable的方式进行实现多线程,因为它比继承Thread的优势在于:

1)适合多个相同的程序代码的线程去处理同一资源

2)可以避免java中的单继承的限制

3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

对于Runnable方式实现多线程来说,每个线程都用同一个实例化对象。而Thread方式实现多线程来说就不是使用同一个实例化对象。


多线程同步和互斥有几种实现方法,都是什么?

1)临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用

2)互斥量(Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似。

3)事件(Even):通过线程间触发事件实现同步互斥

4)信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数,每有一个线程访问共享区资源数就减一,直到资源数小于等于零。


多线程同步和异步有何异同,在什么情况下分别使用它们?举例说明

如果数据将在线程间共享。例如正在写数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步,在很多情况下采用异步途径往往更有效率。



待续。。。。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值