JAVA多线程 每天深入一点|(一)基础篇

1.什么是进程、线程和任务?

进程:是程序运行的实例,是想操作系统申请资源的基本单位。
线程:是进程中单独执行的最小单元。
任务:是线程所要完成的计算。

2.什么是多线程编程?

多线程是以线程为单位的一个种编程规范;多线程不仅仅是使用多个线程进行编程这么简单,其滋生又有需要解决的问题。

3.线程的创建方式?

1)继承Thread,重写run()方法。
2)实现Runnable,重写run()方法。

4.线程两种创建方式的区别?

两者的区别有三种:
1)面向对象的角度来看:Thread基于继承技术,Runnable以接口为构造器参数直接通过new创建Thread实例是一种基于组合技术;组合技术相对于继承技术而言,耦合性更低,更灵活,一般都选用组合技术为优先使用的技术。
2)对象共享的角度来看:Thread每次创建都会创一个线程实例;Runnable的创建方式意味着多个线程实例可以共享一个Runnable实例,更容易实现线程间的资源共享。但在某些情况下可能会导致出乎意料的运行结果。
3)创建对象成本角度来看:在HAVA中线程实例是一个"Runnable"实例,创建它的时候JAVA虚拟机会分配调用栈空间、内核线程等资源。创建一个线程实例比创建一个普通“Rinnable”线程,其成本要相对的高。所以如果创建Runnable实例再将其作为方法参数床底给其他对象使用,而不必利用它再创造相应的线程实例。

5.多线程编程的优势和风险

优势:
1)提高系统吞吐量;多线程编程是的一个进程中可以有多个并发操作。当一个线程处于等待时,其他线程仍然可以执行操作。
2)提高响应性;一个请求处理慢了并不会影响其他其他请求的处理。
3)充分利用多核处理器资源;实施恰当的多线程编程有助于我们充分利用设备的多核处理器资源,从而避免了资源浪费。
4)最小化对系统资源的使用;一个进程中的多个线程可以共享其所在进程所申请的资源,因此使用多个线程相比多个进程进行编程来说,节约了对系统资源的使用。
5)简化程序的结构;线程可以简化复杂应用程序的结构。
风险:
1)线程安全;多个线程共享数据的时候,如果没有采取相应的并发访问控制措施没那么就可能产生数据一致性问题,如果读取脏数据、丢失更新等。
2)线程灵活性;一个线程从其创建到运行结束的整个生命周期会经理若干状态。代码编写不当可能导致某些线程一直处于等待其他线程释放锁的状态,产生了死锁;另外线程是一种稀缺的计算资源,一个系统所拥有的处理器数量相比于该系统中存在的线程数而言总是少之又少,某些情况下可能出现线程饥渴的问题,某些线程永远无法获取处理器执行的机会而永远处于就绪或运行状态。
3)上下文切换;处理器从执行一个线程转向执行另一个线程的时候操作系统所需要做一个动作被称为上下文切换。由于处理器资源的稀缺性,因此上下文切换可以被看作多线程编程的必然产物,它增加了系统的小号,不利于系统的吞吐率。
4)可靠性;多线程一方面可以有利于可靠性,如某个线程意外提前终止了,单着并不影响其他线程继续其处理。另一面线程是进程的一个组件,它总是存在于特定的进程中,如果这个进程由于某种原因意外终止
,如JAVA进程由于内存泄漏导致Java虚拟机奔溃而意外终止,那么该进程中所有的线程也就随之无法继续运行。因此,从提高软件可靠性角度,某些情况下可能要考虑多进程多线程的编程方式,而非简单的单进程多线程方式。

6.线程的属性

线程属性包括线程的编号(ID)、名称(Name)、线程类别(Dacmon)和优先级(Priority);

编号(ID):类型long; 用于表示不同的系统; 只读;
注意:某个编号的线程运行结束后,该标号可能被后续创建的线程使用。不同的线程拥有的标号虽然不同,但是这种编号的唯一性只在JAVA虚拟机的一次运行中有效,也就是说重启一个JAVA虚拟机后某些线程的标号可能上次其他线程编号一样。英雌该属性的值不适合用作某些线程唯一标识,特别是作为数据库的唯一标识。
名称(Name):类型String; 面向开发者的一个属性,用于区分线程; 读写;
注意:JAVA并不禁止我们把不同县城名称设置为相同的值,尽管如此,设置线程名称有助于代码的调试和问题的定位。
线程类别(Dacmon):类型boolean; 值为true是守护线程否则为用户线程; 读写;
注意:该属性的设置必须要在响应线程启动之前,不然会抛出IllegalThreadStateException异常。负责一些关键人物的线程不适宜设置为守护线程。
优先级(Priority):类型int; 该属性本质上给线程调度提示,表示应用程序希望那个程序能优先得到运行; 读写;
注意:一般使用默认优先级即可,不恰当的设置该属性可能导致严重问题(如线程饥渴);

7.线程的生命周期

一个线程从其创建到运行结束的整个生命周期可能存在多个状态;
NEW:创建状态。一个已创建的未启动的线程处于该状态;
RUNNABLE:是一个复合状态。包含两个子状态:READY 就绪状态 和 RUNNING运行状态。就绪是指等待被线程调度器调用,调用后进入运行状态。
BLOCKED:阻塞状态。一个线程发起一个阻塞式I/O操作后或申请一个由其他线程持有的独占资源时,相应线程就会处于该状态。
WAITING:等待状态。一个线程执行了某些特定方法之后就会处于等待状态。
TIMED_WAITING:限时等待状态。处于带有时间限制的等待状态,等待时间结束后自动转换为RUNNABLE就绪状态等待线程被调度。
TERMINATED:结束状态。由于一个线程实例只能够被启动一次,因此一个线程也只坑能有一次处于该状态。

你可能感兴趣的:(JAVA多线程 每天深入一点|(一)基础篇)