今天给大家分享一下,修真院官网JAVA任务10中的深度思考,线程?
一、背景介绍
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
一个线程是程序中的一个执行线程。JVM允许一个应用在运行时有多个执行线程。
每个线程都有一个优先级。高优先级的线程先于低的执行。任何一个线程可能或不可能被标记为守护进程。当运行在同一个线程中的代码创建了一个新线程对象(Thread Object),那么这个新线程将它的优先级设置为与创建它的线程相同的优先级。当且仅当这个线程是守护进程时,新建的线程才是守护进程。也可以在代码里面这种setDeamon(true);。
当JVM启动时,通常只有一个非守护进程的线程,通常会调用某些类的main方法。
二.知识剖析
创建新Thread的两种方式。一个方式是声明一个Thread类的子类,这个子类需要重写Thread类的run方法。然后这个子类的实例可以被分配和启动。
另外一个方式是声明一个类去实现Runnable接口。然后实现run方法。之后这个子类的实例作为创建Thread的参数可以被分配和启动。
大多数情况,应该使用Runnable接口,因为应用只需要重写run()方法,而且如果不打算修改或增强类的基本行为不应该将类进行子类化。
每个线程有一个用于指定它目的的名称,多个线程可以同样的名字。如果没有指定名字,会自动生成。除非额外注明,否则传递一个null参数给构造器或者方法,会造成NullPointerException。
线程属性:线程优先级(不推荐使用),守护线程(为其他线程提供服务),处理未捕获异常的处理器(run方法不能抛出任何被检查,不被检测的异常会导致线程终止。在这种情况下,线程就死亡了。在这种情况下,我们需要实现一个Thread.UncaughtExceptionHandler。我们可以通过这种方式来知道,真正让我们的run意外死亡的问题在哪里。)。
线程状态(NEW, Runnable, Blocked, Waiting, Timed waiting, Terminated)。中断线程:自然终止或异常终止。
竞态条件:两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称为存在竞态条件。导致竞态条件发生的代码区称为临界区。临界区使用适当的同步就可以避免竞态条件。
允许被多个线程同时执行的代码称作线程安全的代码,线程安全的代码不包含竞态条件。
三、常见问题
1、调用 run()方法而非 start()方法?
2、中断线程?
3、线程不安全是什么?
四.解决方案
1、答:应该调用start()方法启动线程。直接调用run()方法不会创建一个新线程。
2、答:执行完run()方法最后一句正常退出;出现了没有捕获的异常,终止run()方法,异常退出。
3、答:线程不安全是指,多个线程对同一个资源进行读写操作时发生。如果只是读的话,不会产生线程不安全,但是如果存在写的线程时,对于资源更新前后,其他线程加载到的值不同。比如3个线程同时调用对数字4加一方法,正常结果是7。但是在线程不安全的情况下,三个线程可能读到的数字都是4,这样三个线程操作的结果就是5了。这就是线程不安全。解决办法是在加一方法的签名中加同步锁,就是synchronized关键字。这样在一个线程获得加一方法后,其他线程等待这个线程完成后,在调用加一方法。
五。编码实战
六、参考文献
https://www.cnblogs.com/android-blogs/p/5765148.html
https://blog.csdn.net/quinnnorris/article/details/55106626?utm_source=gold_browser_extension
https://blog.csdn.net/quinnnorris/article/details/55522555
8.更多讨论
鸣谢
感谢观看,如有出错,恳请指正
七.更多讨论
详见视频
感谢大家观看
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
我的邀请码链接:http://www.jnshu.com/login/1/20535344
使用我的优惠码优惠多多!
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~