- 阅读下列代码,如果希望将切面作用于 Calculator 类的方法上,则切入点表达式为 C
package org.example.demo;
import org.springframework.stereotype.Component;
@component
public class calculator {
public int add(int a, int b){ return a + b; }
public int sub(int a, int b){ return a -b; }
public int mul(int a, int b){ return a * b; }
public int div(int a, int b){ return a /b; }
}
A、@Pointcut(value ="execution(* org.example.demo.*.*(*))")
B、@Pointcut(value ="execution(* org.example.demo,*,*(..))")
C、@Pointcut(value = "execution(* org.example.demo.*(..))")-------------------------
D.@Pointcut(value ="execution(org.example.demo.*.*(..))")
本题可根据 Spring AOP 中切入点表达式 execution 的语法规则,对每个选项进行分析,从而确定能将切面作用于 Calculator 类方法上的切入点表达式。
execution 切入点表达式语法
execution 是 Spring AOP 中最常用的切入点指示符,其基本语法为:
收起
plaintext
execution(修饰符? 返回类型 类路径?方法名(参数) throws 异常?)
- 修饰符:可选,如 public、private 等。
- 返回类型:必填,可以使用通配符 * 表示任意返回类型。
- 类路径:可选,可使用通配符,指定类的全限定名。
- 方法名:必填,可使用通配符。
- 参数:必填,() 表示无参数,(..) 表示任意数量和类型的参数,(*) 表示有一个任意类型的参数,(*,*) 表示有两个任意类型的参数。
- 异常:可选。
选项分析
A 选项:@Pointcut(value = "execution(* org.example.demo.*.*(*))")
该表达式表示匹配 org.example.demo 包下所有类的所有方法,且方法必须有一个任意类型的参数。而 Calculator 类的方法可以有两个参数,此表达式不能完全匹配 Calculator 类的所有方法,所以 A 选项错误。
B 选项:@Pointcut(value = "execution(* org.example.demo,*,*(..))")
此表达式存在语法错误,包名中不应该出现逗号,正确的包名分隔符是点号 .,所以 B 选项错误。
C 选项:@Pointcut(value = "execution(* org.example.demo.*(..))")
该表达式表示匹配 org.example.demo 包下所有类的所有方法,方法的返回类型任意,参数数量和类型也任意。Calculator 类位于 org.example.demo 包下,此表达式可以匹配 Calculator 类的所有方法,所以 C 选项正确。
D 选项:@Pointcut(value = "execution(org.example.demo.*.*(..))")
该表达式没有指定返回类型,这不符合 execution 切入点表达式的语法规则,正确的应该在类路径前指定返回类型,所以 D 选项错误。
综上,答案是 C。
2.[多选]
下面关于 HTTP 描述正确的是() a b d
A.GET: 向服务器获取资源,比如常见的查询请求------
B.POST:向服务器提交数据而发送的请求----
C.GET请求的数据,在URL是看不见
D. Head: 和 get 类似,返回的响应中没有具体的内容,用于获取报头----
本题可根据 HTTP 不同请求方法的特点,对每个选项进行逐一分析。
选项 A
在 HTTP 协议中,GET 方法的主要用途是从服务器获取资源。它常用于向服务器请求特定的数据,例如在网页中查询商品信息、获取文章内容等。在浏览器地址栏输入 URL 并回车,通常就是发送一个 GET 请求。所以选项 A 描述正确。
选项 B
POST 方法主要用于向服务器提交数据。当用户在表单中填写信息并提交时,通常会使用 POST 请求将数据发送到服务器进行处理,比如用户注册、登录、提交订单等操作。所以选项 B 描述正确。
选项 C
GET 请求会将请求的数据附加在 URL 后面,以键值对的形式呈现,例如 http://example.com/api?param1=value1¶m2=value2 。因此,GET 请求的数据在 URL 上是可见的。所以选项 C 描述错误。
选项 D
HEAD 请求和 GET 请求类似,它们的区别在于 HEAD 请求只请求资源的头部信息,而不请求资源的具体内容。服务器在响应 HEAD 请求时,会返回和 GET 请求相同的头部信息,但不会返回响应体。这种请求方式常用于在不获取实际资源内容的情况下,获取资源的元信息,如资源的大小、修改时间等。所以选项 D 描述正确。
综上,答案是 ABD。
3.[多选]
高并发测试中,数据库数据问题往往出现很多,下面关于隔离级别描述正确的是 a b c
A.脏读:事务中的修改即使没有提交,其他事务也能看见,事务可以读到未提交的数据称为脏读
B.不可重复读: 同个事务前后多次读取,不能读到相同的数据内容,中间另一个事务也操作了该同一数据---
C、幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,发现两次不一样,产生幻读---
D.事务的隔离级别越高,事务越安全,并发能力越高。
本题可依据数据库事务隔离级别及相关异常现象的定义,对各选项进行分析判断。
选项 A
脏读是数据库并发操作中一种常见的数据不一致问题。在一个事务对数据进行修改但尚未提交时,另一个事务能够读取到这些未提交的数据。由于这些数据可能会因为原事务的回滚而失效,所以读取到这样的数据就被称为脏读。该选项对脏读的描述准确,所以选项 A 正确。
选项 B
不可重复读指的是在同一个事务中,对同一数据进行多次读取时,由于在两次读取之间另一个事务对该数据进行了修改并提交,导致前后读取到的数据内容不一致。这种情况破坏了事务的一致性,该选项对不可重复读的解释符合其定义,所以选项 B 正确。
选项 C
幻读通常发生在事务进行范围查询时。当一个事务正在读取某个范围内的记录时,另一个事务在该范围内插入或删除了新的记录。当原事务再次进行相同范围的查询时,会发现查询结果与之前不同,就好像出现了 “幻影” 一样的新记录或消失的记录。该选项对幻读的描述是正确的,所以选项 C 正确。
选项 D
一般来说,事务的隔离级别越高,它能避免的数据不一致问题就越多,事务也就越安全。例如,较高的隔离级别可以有效避免脏读、不可重复读和幻读等问题。然而,更高的隔离级别往往需要使用更严格的锁机制来保证数据的一致性,这会导致事务之间的并发能力降低。比如串行化隔离级别是最高的隔离级别,但在这种级别下,事务是串行执行的,并发性能最差。所以选项 D 错误。
综上,答案是 ABC。
4.[单选]
MySQL 中 delete from table where 后哪项操作不会释放磁盘物理空间?
A. alter table tablename add column
B. optimize table tablename;
C. alter table tablename engine=innodb;
D. renarie table tablename to tablename new
本题可根据 MySQL 中各操作对磁盘物理空间的影响,对每个选项进行分析,从而确定不会释放磁盘物理空间的操作。
选项 A:alter table tablename add column
alter table tablename add column 操作是向表中添加一个新的列。此操作主要是修改表的结构,并不会对表中已删除的数据所占用的磁盘物理空间进行释放。它只是在表的元数据中添加了新列的定义,同时可能会根据数据类型和表的存储引擎分配一定的空间用于存储新列的数据,但这与释放因 delete 操作产生的空闲空间无关。所以该操作不会释放磁盘物理空间。
选项 B:optimize table tablename;
OPTIMIZE TABLE 语句主要用于优化表的物理存储。当使用 DELETE 语句删除数据后,表中会产生一些碎片化的空闲空间。OPTIMIZE TABLE 会重新整理表的数据和索引,将这些碎片化的空间合并并释放,从而减少表占用的磁盘空间。因此,该操作会释放磁盘物理空间。
选项 C:alter table tablename engine=innodb;
当执行 ALTER TABLE tablename ENGINE = InnoDB; 时,MySQL 会重新创建该表。在重新创建表的过程中,会重新组织数据的存储,删除那些因 DELETE 操作而产生的不再使用的空间,进而释放磁盘物理空间。所以该操作会释放磁盘物理空间。
选项 D:rename table tablename to tablename_new
RENAME TABLE 语句只是对表的名称进行修改,它不会改变表中数据的存储结构和占用的磁盘空间。在修改表名的过程中,原表中的数据和索引等信息会完整地保留,不会对因 DELETE 操作产生的空闲空间进行处理。不过,这并不符合题目要求,因为它与释放磁盘物理空间的操作无关,而本题问的是在 delete 操作后哪种操作不会释放磁盘物理空间,该选项不涉及空间释放的逻辑,所以不选。
综上,答案是 A。
5.[多选]
下面哪些选项属于强缓存?
A. Expires
B. Cache-Control
c. Last-Modified
D. ETag
本题可根据 HTTP 缓存机制中强缓存和协商缓存的相关概念,对每个选项进行分析判断。
强缓存和协商缓存的概念
- 强缓存:浏览器直接从本地缓存中读取资源,而不需要向服务器发送请求。强缓存的判断依据主要是 Expires 和 Cache-Control 这两个响应头字段。
- 协商缓存:浏览器在读取缓存之前会先向服务器发送一个请求,询问服务器该资源是否有更新。如果没有更新,服务器返回 304 状态码,浏览器则使用本地缓存;如果有更新,服务器返回新的资源。协商缓存的判断依据主要是 Last-Modified 和 ETag 这两个响应头字段。
选项分析
选项 A:Expires
Expires 是 HTTP 1.0 中用于控制缓存的字段,它的值是一个具体的时间点,表示资源的过期时间。在这个时间点之前,浏览器会直接使用本地缓存,而不会向服务器发送请求。因此,Expires 属于强缓存的范畴。
选项 B:Cache-Control
Cache-Control 是 HTTP 1.1 中引入的更强大的缓存控制字段,它可以通过多个指令来精确控制缓存的行为,例如 max-age 指令指定资源的缓存时间。当浏览器接收到带有 Cache-Control 头的响应时,会根据其中的指令来判断是否可以直接使用本地缓存。所以,Cache-Control 也属于强缓存。
选项 C:Last-Modified
Last-Modified 是一个协商缓存字段,它表示资源的最后修改时间。当浏览器再次请求该资源时,会在请求头中添加 If-Modified-Since 字段,其值为之前响应头中 Last-Modified 的值。服务器会比较这个时间和资源的实际最后修改时间,如果没有变化则返回 304 状态码,让浏览器使用本地缓存;如果有变化则返回新的资源。因此,Last-Modified 不属于强缓存。
选项 D:ETag
ETag 也是一个协商缓存字段,它是资源的一个唯一标识符,通常是根据资源的内容生成的一个哈希值。当浏览器再次请求该资源时,会在请求头中添加 If-None-Match 字段,其值为之前响应头中 ETag 的值。服务器会比较这个 ETag 值和当前资源的 ETag 值,如果相同则返回 304 状态码,让浏览器使用本地缓存;如果不同则返回新的资源。所以,ETag 不属于强缓存。
综上,答案是 AB。
7.[单选]
在JDK1.8 版本中,Hashset 的底层存储结构是什么?
A 数组
B.栈
C.数组+链表+红黑树
D.数组+链表
本题可根据 Java 中 HashSet 的实现原理,结合 JDK 1.8 版本的特性来确定其底层存储结构。
HashSet 底层实现原理
HashSet 是 Java 集合框架中的一个类,它实现了 Set 接口,用于存储不重复的元素。HashSet 底层是基于 HashMap 实现的,其元素存储在 HashMap 的键(key)位置,而值(value)位置则统一存储一个静态的常量对象。
不同 JDK 版本中 HashMap 的底层结构
- JDK 1.7 及以前:HashMap 的底层结构是数组 + 链表。数组作为哈希表的基础存储结构,每个数组元素称为一个桶(bucket)。当发生哈希冲突时(即不同的元素计算出相同的哈希值),这些元素会以链表的形式存储在同一个桶中。
- JDK 1.8 及以后:为了优化哈希冲突严重时的性能,HashMap 的底层结构变为数组 + 链表 + 红黑树。在哈希冲突较少的情况下,元素依然以链表的形式存储在桶中;但当链表的长度超过一定阈值(默认是 8)且数组长度达到 64 时,链表会转换为红黑树。红黑树是一种自平衡的二叉搜索树,它可以将查找、插入和删除操作的时间复杂度从链表的 优化到 ,从而提高了性能。
由于 HashSet 底层是基于 HashMap 实现的,所以在 JDK 1.8 版本中,HashSet 的底层存储结构也是数组 + 链表 + 红黑树。
综上,答案选 C。
8.{单选)
Linux中权限为765的文件,下列哪个是正确的权限位标记2
A -rwxr-xrwx
B.-rw-rw-r-x
C.-rwxrw-r-x
D.-rw-r-xr-r
本题可根据 Linux 文件权限的数字表示法和字符表示法的对应规则,来判断权限为 765 的文件对应的正确权限位标记。
Linux 文件权限的表示方法
在 Linux 系统中,文件权限有数字表示法和字符表示法两种。
数字表示法
数字表示法使用三个八进制数字分别表示文件所有者(user)、所属组(group)和其他用户(others)的权限,每个数字是对应权限的累加值,其中:
- 读权限(read)用数字 4 表示。
- 写权限(write)用数字 2 表示。
- 执行权限(execute)用数字 1 表示。
例如,数字 7 表示读(4)+ 写(2)+ 执行(1)权限;数字 6 表示读(4)+ 写(2)权限;数字 5 表示读(4)+ 执行(1)权限。
字符表示法
字符表示法使用一系列字符来表示文件的类型和权限,格式为 [文件类型][所有者权限][所属组权限][其他用户权限]。
- 文件类型通常用 - 表示普通文件,d 表示目录等。
- 所有者权限、所属组权限和其他用户权限分别用三个字符表示,r 表示读权限,w 表示写权限,x 表示执行权限,没有相应权限则用 - 表示。
分析权限数字 765
- 第一个数字 7 表示文件所有者的权限,即读(4)+ 写(2)+ 执行(1),对应的字符表示为 rwx。
- 第二个数字 6 表示文件所属组的权限,即读(4)+ 写(2),对应的字符表示为 rw-。
- 第三个数字 5 表示其他用户的权限,即读(4)+ 执行(1),对应的字符表示为 r-x。
综合起来,权限为 765 的文件对应的权限位标记为 -rwxrw-r-x。
所以答案选 C。
9.[单逝]
某文件的组外成员的权限为只读,所有者有全部权限,组内的权限为读与写,则该文件的权限为
A764
B. 674
c.476
D、467
本题可根据 Linux 文件权限的数字表示法规则,结合题目中给出的不同用户角色的权限信息,来确定该文件对应的权限数字。
Linux 文件权限的数字表示法规则
在 Linux 系统中,文件权限使用三个八进制数字分别表示文件所有者(user)、所属组(group)和其他用户(others)的权限,每个数字是对应权限的累加值,具体规则如下:
- 读权限(read)用数字 4 表示。
- 写权限(write)用数字 2 表示。
- 执行权限(execute)用数字 1 表示。
分析题目中不同用户角色的权限
- 所有者权限:题目中提到所有者有全部权限,即读(4)、写(2)和执行(1)权限,将这些权限对应的数字相加,,所以所有者权限对应的数字是 7。
- 所属组权限:组内的权限为读与写,即读(4)和写(2)权限,将这两个权限对应的数字相加,,所以所属组权限对应的数字是 6。
- 其他用户(组外成员)权限:组外成员的权限为只读,即读(4)权限,所以其他用户权限对应的数字是 4。
确定文件的权限数字
按照所有者、所属组、其他用户的顺序,将对应的权限数字组合起来,得到该文件的权限为 764。
综上,答案选 A。
10.[单选]
Linux中lsof命令主要用途是?
A 拷贝文件
B.删除文件
C. 移动文件
D.查看端口占用
本题可根据lsof命令以及各选项所涉及操作对应的命令的功能来进行判断。
选项 A:拷贝文件
在 Linux 中,用于拷贝文件的命令是cp。例如,要将文件file1拷贝到file2,可以使用命令cp file1 file2。所以选项 A 不符合lsof命令的用途。
选项 B:删除文件
在 Linux 系统里,删除文件使用的是rm命令。比如要删除文件test.txt,可以执行rm test.txt。因此选项 B 也不是lsof命令的用途。
选项 C:移动文件
移动文件在 Linux 中通常使用mv命令。若要将文件file1移动到目录dir下,可使用mv file1 dir。所以选项 C 同样不是lsof命令的用途。
选项 D:查看端口占用
lsof(list open files)命令的主要功能是列出当前系统中所有打开的文件。由于在 Linux 系统中,网络套接字(socket)也被视为文件,所以可以利用lsof命令来查看哪些进程正在使用哪些端口,也就是查看端口占用情况。例如,要查看 8080 端口的占用情况,可以使用命令lsof -i :8080。所以选项 D 是lsof命令的主要用途之一。
综上,答案是 D。
11.[单选]
关于 MySQL 三级封锁协议,下列说法正确的是?
A.一级封锁协议可以解决”幻影读"的问题
B.二级封锁协议可以解决“丢失修改"问题
C.二级封锁协议可以解决“不可重复读”回题
D.一级封锁协议可以解决“读脏数据“问题
本题可根据 MySQL 三级封锁协议各自的特点和能解决的问题,对每个选项进行分析判断。
一级封锁协议
一级封锁协议规定:事务在修改数据对象之前必须先对其加 X 锁(排他锁),直到事务结束才释放。它主要用于解决 “丢失修改” 问题。具体来说,当多个事务同时对同一数据进行修改时,如果没有锁机制,可能会导致某些修改被覆盖而丢失。而一级封锁协议通过加 X 锁保证了在一个事务修改数据期间,其他事务无法对该数据进行修改,从而避免了丢失修改的情况。但一级封锁协议不能解决 “读脏数据”“不可重复读” 和 “幻影读” 问题。
二级封锁协议
二级封锁协议是在一级封锁协议的基础上,增加了事务在读取数据对象之前必须先对其加 S 锁(共享锁),读完后即可释放 S 锁的规则。二级封锁协议可以解决 “丢失修改” 和 “读脏数据” 问题。“读脏数据” 是指一个事务读取了另一个事务未提交的数据,而二级封锁协议通过加 S 锁,保证了在读取数据时,如果数据被其他事务加了 X 锁(正在修改且未提交),当前事务会被阻塞,从而避免读取到脏数据。但二级封锁协议不能解决 “不可重复读” 和 “幻影读” 问题。
三级封锁协议
三级封锁协议是在一级封锁协议的基础上,规定事务在读取数据对象之前必须先对其加 S 锁,直到事务结束才释放 S 锁。三级封锁协议可以解决 “丢失修改”“读脏数据” 和 “不可重复读” 问题,但不能解决 “幻影读” 问题。“不可重复读” 是指在同一个事务中,多次读取同一数据却得到不同的结果,三级封锁协议通过在事务期间一直持有 S 锁,保证了在事务执行过程中,其他事务不能修改该数据,从而避免了不可重复读的情况。
选项分析
- 选项 A:一级封锁协议不能解决 “幻影读” 问题,“幻影读” 通常需要更高级别的隔离机制或额外的锁定策略来处理,所以选项 A 错误。
- 选项 B:二级封锁协议在一级封锁协议的基础上增加了读操作的锁机制,能够解决 “丢失修改” 和 “读脏数据” 问题,所以选项 B 正确。
- 选项 C:二级封锁协议不能解决 “不可重复读” 问题,三级封锁协议才能解决 “不可重复读” 问题,所以选项 C 错误。
- 选项 D:一级封锁协议不能解决 “读脏数据” 问题,二级封锁协议可以解决 “读脏数据” 问题,所以选项 D 错误。
综上,答案是 B。
12.[单选]
Aspect 是一个基于 Java 语言的 AOP 框架,从 Spring2.0 开始,Spring AOP 引入了对 Aspect 的支持,Aspect 扩
展了Javà 语言,提供了一个专门的编译器,在缩译时提供横向代码的织入,该说法正确吗?
O A镨
●B.对
答案选 B,该说法是正确的。以下为你详细分析:
AspectJ 简介
AspectJ 是一个基于 Java 语言的 AOP(面向切面编程)框架,它对 Java 语言进行了扩展,定义了一套自己的语法规则,使得开发者可以更方便地实现面向切面编程的功能。
Spring AOP 对 AspectJ 的支持
从 Spring 2.0 开始,Spring AOP 引入了对 AspectJ 的支持。Spring 既可以使用基于代理的 AOP 实现,也可以集成 AspectJ 来实现更强大的 AOP 功能。
AspectJ 的编译时织入
AspectJ 提供了专门的编译器(ajc)。在编译时,这个编译器会对 Java 源代码进行处理,将切面(Aspect)中定义的横向代码(如日志记录、事务管理等)织入到目标类的字节码中。与 Spring AOP 基于运行时代理的织入方式不同,AspectJ 的编译时织入是在编译阶段完成的,生成的字节码已经包含了切面逻辑,因此可以实现更细粒度的 AOP 功能,并且性能可能会更好。
综上所述,题目的描述是正确的。
13.[单选]
下列 TCP 进程处理失败的连接做法正确的是?
A. 发送一个 FIN 段询问接收方的状态
B.发送-个 ACK 段并立即终止连接
C.发送一个复位(RST)段来重置接收方的重传计时器
D.在超出最大重试次数后发送一个复位(RST)段
答案选 D。以下是对本题各选项的详细分析:
选项 A
发送一个 FIN 段是用于正常关闭 TCP 连接的操作,其作用是表示发送方已经没有数据要发送了,请求关闭连接。它并不是用来处理失败连接的方式,FIN 段主要参与的是 TCP 连接的四次挥手正常关闭流程,而不是针对连接失败情况的处理,所以选项 A 错误。
选项 B
ACK 段主要用于对收到的数据进行确认,告知发送方数据已经成功接收。单独发送一个 ACK 段并立即终止连接不符合 TCP 处理失败连接的逻辑,它只是一个确认机制,不能解决连接失败的问题,也不是处理失败连接的标准做法,所以选项 B 错误。
选项 C
复位(RST)段的作用是强制关闭连接,而不是重置接收方的重传计时器。当 TCP 收到一个 RST 段时,会立即中断当前的连接。重传计时器是 TCP 为了保证数据可靠传输而设置的一个定时器,用于在数据未及时收到确认时进行重传操作,RST 段和重传计时器的重置没有关系,所以选项 C 错误。
选项 D
在 TCP 连接过程中,当出现问题(如丢包、网络故障等)时,发送方会进行重试。为了避免无限重试消耗系统资源,会设置一个最大重试次数。当超出这个最大重试次数后,说明当前连接很可能无法正常建立或维持,此时发送一个复位(RST)段来强制关闭连接是合理且正确的处理方式,所以选项 D 正确。
综上,答案是 D。
14.[单选)
关于 @order 注解,最正确的描述是
A. 指定-个 bean 的范围
B.全不正确
C.使用此注解相当于实现了 org.springframework.core,Ordered 接口
D.通常用于注入域对象的属性
答案选 C。下面为你详细分析每个选项:
选项 A
指定一个 bean 的范围通常使用的是 Spring 中的 @Scope 注解,比如 @Scope("singleton") 表示单例作用域,@Scope("prototype") 表示原型作用域等。而 @Order 注解的主要功能并非指定 bean 的范围,所以选项 A 错误。
选项 B
选项 C 是正确的描述,所以选项 B 错误。
选项 C
@Order 注解是 Spring 框架提供的一个注解,它的作用是指定 bean 的加载顺序。当实现 org.springframework.core.Ordered 接口时,需要重写 getOrder() 方法来返回一个整数,该整数表示 bean 的顺序,数值越小,优先级越高。使用 @Order 注解时,可以直接在类上添加该注解并指定一个整数值,这和实现 Ordered 接口达到的效果是类似的,都是用来确定 bean 的加载顺序,所以选项 C 正确。
选项 D
通常用于注入域对象属性的注解有 @Autowired、@Resource 等。@Autowired 可以根据类型进行自动装配,@Resource 可以根据名称或者类型进行装配。而 @Order 注解和注入域对象的属性没有关系,所以选项 D 错误。
综上所述,正确答案是 C。
15.[单选]
下列选项中关于 JC 常见的方法说法错误的是( )?
A. setPriority(int):修改线程优先级。
B.isAlive0:线程是否存活(还没有运行完毕)。
c.start0: 新线程启动后会调用的方法。
D.join(long n):等待线程运行结束,最多等待 n 毫秒。
答案选 C。下面对每个选项进行详细分析:
选项 A
在 Java 中,Thread
类提供了 setPriority(int newPriority)
方法用于修改线程的优先级。线程优先级的范围是 1 到 10,其中 1 是最低优先级(Thread.MIN_PRIORITY
),10 是最高优先级(Thread.MAX_PRIORITY
),5 是默认优先级(Thread.NORM_PRIORITY
)。通过调用该方法可以改变线程调度器对线程的调度顺序倾向,所以选项 A 说法正确。
选项 B
Thread
类的 isAlive()
方法用于判断线程是否处于活动状态,即线程是否还没有运行完毕。如果线程已经启动且尚未终止,该方法返回 true
;否则返回 false
,所以选项 B 说法正确。
选项 C
Thread
类的 start()
方法的作用是启动一个新线程,使该线程进入可运行状态。当线程获得 CPU 时间片后,会自动调用该线程对象的 run()
方法来执行具体的任务逻辑,而不是调用 start()
方法本身,所以选项 C 说法错误。
选项 D
Thread
类的 join(long millis)
方法用于等待该线程终止,最多等待 millis
毫秒。如果在指定的时间内线程结束,方法会正常返回;如果超过指定时间线程仍未结束,方法也会返回。还有一个无参的 join()
方法,它会一直等待线程结束,所以选项 D 说法正确。
综上所述,答案是 C。