03月14日 晴 又太阳了
今天讲多线程,大学自学时,对内存没有啥概念,进程,线程啥的有点像空中楼阁,一时折磨不透,便选择回避它,嘿嘿,问题只要我不去关注它,它就不存在。今天本来还想当回鸵鸟,好死不死,被小胖伤到自尊啦。
小胖:叶子哥,问你几个问题,1>线程为什么要分那么多状态啊 2>线程创建使用extends Thread方法就行啦,为什么还提供了一个Runnable接口方式呢 3>为什么调用sleep方法,线程就停下来,时间到继续往下走,使用wait要等呢 4>多线程操作那么麻烦,注意这,注意那的,单线程操作不好么?
我:牛逼,转性啦,这是问题都能问出来?
小胖:九年义务教育早满足不了我啦,哥也补课啦好不好。
我:牛逼,这次哥认怂,真不会。
小胖:叶子哥,你别藏拙啦,知道你会的,跟大伙说说啊。
说完,还叫来小瘦,老A,B哥跟小C恶意围观。大爷的,看着地下的三室二厅2卫,默默举起手,搬救兵啊。
海燕老师:叶子啥问题啊
我:小胖,提前学了多线程,结合今天讲的内容,想到几个很有深度的问题,想跟老师探讨一下,他还说你不一定能回答的出来。
海燕老师:哦,小胖你说说看,看能不能回答。
小胖满脸黑线,额头跑过一群神兽,无奈重复一遍上面的问题。
海燕老师:可以啊,有想法,看不出你还有这一手,继续保持啊。
问题1:线程分多状态跟2个因素有关,a:操作系统分时操作有关 b:程序方便控制有关。操作系统为提高cpu运行效率,使用时间片轮询执行方法,线程刚好在执行时间片上那么它就是运行时状态,如果不是那么就是等待状态。由这个决定线程2个状态,后续针对线程做更细致的控制,那么就需要更多的状态,比如开始,死亡,阻塞等。
问题2:这是个好问题,其实看Thread的源码,你会发现Runnable实现方式本质还是Thread方法,最后都是要执行Thread的run方法,而run方法中又去调用runnable重写的run方法。这样设计符合设计模式里面说的接口隔离原则,使用Runnable接口分离出线程业务逻辑,起到程序解耦的作用。
问题3:sleep方法会将当前线程休眠指定时间,此时的线程并不会释放资源(放弃cpu控制权),其他线程就必须等,sleep休眠时间到了之后,线程继续。wait方法不一样,它会让当前执行的线程释放资源,进入等待状态,后续需要专有的唤醒信号才会激活,某些特殊场景为了防止一直等情况,给wait加上过期时间,当时间一定,该线程自动醒来,进入就绪状态等待cpu的临幸。
问题4:单线程操作好啊,但是现在电脑基本都是多核多线程,使用单线程跑程序有点大材小用,为了榨干cpu的性能,多线程操作是个好方式。但也不绝对,后面大家要学得redis就是使用单线程操作。
众人:哦~
我:懂了,哈哈,鸵鸟要抬头了~