JavaSE02

1.判断下列哪些是合法的标识符:

identifier 、userName 、class 、98.3 、Data#、user_name 、_sys_var1 、$change 、blue bird

按照标识符的命名规则进行判断,可以得出合法标识符为:

identifier 、userName、user_name 、_sys_var1 、$change

(一)选择题

1.对于一个三位的正整数 n,取出它的十位数字k(k为整型)的表达式是

A.k = n/10%10

B.k = n%10%10

C.k = n%10

D.k = n/10

2.设 x = 1 , y = 2 , z = 3,则表达式 y+=z--/++x中y的值是

A. 3

B. 3. 5

C. 4

D. 5

3.执行下列程序段后,b, x, y的值分别是

int x = 6,y = 8; 
boolean b;
b = x>y && ++x == --y;

A.true , 6, 8

B.false , 7, 7

C.true, 7, 7

D.false, 6, 8

4.Java语言中,占用32位存储空间的是

A.long,double

B.long,float

C.int,double

D.int,float

5.现有一个变量声明为boolean aa;下面赋值语句中正确的是

A.aa=false;

B.aa=False;

C.aa="true";

D.aa=0;

6.下列数据类型的精度由高到低的顺序是

A.float,double,int,long

B.double,float,int,byte

C.byte,long,double,float

D.double,int,float,long

7.以下的选项中能正确表示Java语言中的一个整型常量的是

A.12.

B. -20

C.1,000

D.4 5 6

8.下面不正确的变量名是

A. haha

B. 23_number

C. _ADC

D. $123

9.下列单词中,不属于Java关键字的是

A.NULL

B.class

C.this

D.byte

10.下面哪个标识符是合法的

A.#_pound

B.$123+w

C.5Interstate

D.a_b

11.下列哪一个是合法的标识符

A.12class

B.+viod

C.-5

D._black

12.指出下列类型转换中正确的是

A.int i=8.3;

B.long L=8.4f;

C.int i=(boolean)8.9;

D.double d = 100;

13.定义变量int i=3;那么表达式i/6 * 5的计算结果是

A.0

B.1

C.2.5

D.2

14.关于数据类型转换的说法哪个是不正确的

A.Java共有两种数据类型的转换方式:自动转换和强制转换。

B.Java中当两个类型不同的运算对象进行二元运算时,Java自动把精度较低的类型转换成另一个精度较高的类型。

C.boolean型数据能和其他数据类型进行转换。

D.char型和int型数据可以互相转换。

15.下列语句执行后,变量m、n的值分别是

int x = 23,m,n;
m = x/100;
n = x%10;

A.0,3

B.0,2

C.3,0

D.3,1

16.设x = 2 ,则表达式 ( x++ ) * 3 的值是

A.6

B.9

C.6.0

D.9.0

17.已知x和y均为boolean型变量,则x && y的值为true的条件是什么?

A.至少其中一个为true

B.至少其中一个为false

C.x和y均为true

D.x和y均为false

18.设有定义float x=3.5f, y=4.6f, z=5.7f;则以下的表达式中,值为true的是

A.x > y || x > z

B.x != y

C. z > ( y + x )

D.x < y & ! ( x < z )

(二)简答题

  1. Java中的基本数据类型共有四种,分别是什么?
  2. 写出定义双精度浮点型常量G,值为9.8的语句。
  3. 定义int a=6,b; b=a++*3; 程序执行后 a、b的值分别为多少?
  4. 设 x = 2 ,则表达式 x++/3 的值是____。
  5. 若x = 5,y = 10,则x < y和x >= y的逻辑值分别为多少?

(三)编程题

  1. 已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序。
  2. 给定一个0~1000的整数,求各位数的和,例如345的结果是3+4+5=12注:分解数字既可以先除后模也可以先模后除。
  3. 华氏温度和摄氏温度互相转换,从华氏度变成摄氏度你只要减去32,乘以5再除以9就行了,将摄氏度转成华氏度,直接乘以9,除以5,再加上32即行。
  4. 给定一个任意的大写字母A~Z,转换为小写字母。
package com.javase02.code03_thread.g_threadpool06.demo01; /** * 缓冲区 */ public class Buffered { // 声明flag标记 用来调节数字和字母之间的执行 // flag为false时打印数字执行打印字母等待 true时打印字母执行打印数字等待 private boolean flag; public synchronized void number(int num) { // 1.判断flag状态 if (flag) { try { // 线程等待 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 2.打印数字 System.out.print(num + " "); // 判断传入的数字取余2是否为0 为0则代表打印两次 if (num % 2 == 0) { //3.修改flag的状态 this.flag = true; // 4.唤醒打印字母线程 this.notify(); } } public synchronized void letter(char chr){ // 1.判断flag的状态 if (!flag){ try { // 线程等待 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } // 2.打印字母 System.out.print(chr + " "); // 3.修改flag状态 this.flag = false; // 4.唤醒线程 this.notify(); } } package com.javase02.code03_thread.g_threadpool06.demo01; /** * 缓冲区 */ public class Buffered { // 声明flag标记 用来调节数字和字母之间的执行 // flag为false时打印数字执行打印字母等待 true时打印字母执行打印数字等待 private boolean flag; public synchronized void number(int num) { // 1.判断flag状态 if (flag) { try { // 线程等待 this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else { // 2.打印数字 System.out.print(num + " "); // 判断传入的数字取余2是否为0 为0则代表打印两次 if (num % 2 == 0) { //3.修改flag的状态 this.flag = true; // 4.唤醒打印字母线程 this.notify(); } } }
03-19
<think>好的,我现在需要帮助用户解决如何通过Java实现线程间协作以交替打印数字和字母的问题。首先,我需要理解用户的需求。他们希望两个线程能够交替打印,一个打印数字,另一个打印字母,形成交替输出的效果。这涉及到线程间的同步和通信,确保两个线程能够按顺序执行,不会出现竞争条件或者乱序。 接下来,我要回忆Java中线程协作的机制。常用的方法有使用synchronized关键字配合wait()和notify()/notifyAll()方法,或者使用Lock和Condition接口。根据用户提供的引用内容,特别是引用[3]和引用[5],用户提到了使用锁中的线程通信以及Condition精准唤醒的方法。所以可能需要考虑这两种方法。 用户给的示例中,引用[3]提到了交替打印A/B或1到100时,需要使用lock.notify()和lock.wait(),否则当前线程释放锁后可能立即重新获取,导致无法交替。这说明正确的线程间通信是关键。同时引用[5]指出,方式三使用Lock的Condition可以精准唤醒,减少CPU资源消耗,这可能是一个更效的解决方案。 首先,我需要确定使用哪种同步机制。synchronized结合wait/notify是基础方法,而Lock和Condition提供了更灵活的控制,比如多个Condition对象可以分别管理不同的线程组,这样唤醒特定线程会更效,避免不必要的竞争。 接下来,我需要设计两个线程,一个负责打印数字,另一个打印字母。它们需要交替执行,所以需要共享一个锁对象,以及可能的状态变量来指示当前应该轮到哪个线程执行。 对于synchronized的方式,步骤如下: 1. 创建一个共享对象作为锁。 2. 使用一个标志变量(比如布尔值)来决定该哪个线程执行。 3. 每个线程在进入同步块后检查标志,如果不符合自己的执行条件,则调用wait()进入等待状态。 4. 执行完打印操作后,切换标志,并调用notify()或notifyAll()唤醒另一个线程。 对于Lock和Condition的方式: 1. 创建Lock对象和两个Condition对象,分别对应数字线程和字母线程。 2. 同样使用标志变量控制执行顺序。 3. 每个线程在获取锁后检查标志,如果不符合条件,使用对应的Condition.await()等待。 4. 执行完成后,切换标志,并通过另一个Condition.signal()唤醒对方线程。 然后,我需要编写示例代码,确保语法正确,并且符合用户提供的引用中的结构。例如,引用[1]中的线程类结构,引用[3]中的锁使用和通信机制。 同时,需要注意避免死锁和确保线程安全。比如,在调用wait()时,通常需要在循环中检查条件,防止虚假唤醒。这一点在引用[3]的代码示例中也有体现,使用了while循环来检查临界值。 此外,用户可能关心代码的可读性和效率。比如,使用Lock和Condition可以更精准地唤醒目标线程,减少不必要的唤醒操作,提效率,如引用[5]所述。 最后,我需要测试示例代码,确保其能够正确交替打印数字和字母。例如,数字线程打印1,字母线程打印A,接着数字打印2,字母打印B,依此类推,直到完成指定次数。 总结下来,步骤是: 1. 确定同步机制(synchronized或Lock+Condition)。 2. 设计共享变量和锁对象。 3. 实现线程的执行逻辑,包括检查条件、等待、打印、切换标志、唤醒对方线程。 4. 编写代码并验证正确性。 现在需要将以上思考转化为结构化的回答,包括代码示例和详细解析,同时引用用户提供的参考文献中的相关内容。</think>### Java实现线程协作交替打印数字与字母 #### 实现原理 线程交替打印的核心是**同步锁+线程通信**。通过共享锁控制执行顺序,使用`wait()`/`notify()`或`Condition`实现精准唤醒,避免无意义的CPU空转[^3][^5]。 --- #### 方法一:synchronized + wait/notify ```java public class AlternatePrint { private static final Object lock = new Object(); private static boolean flag = true; // 控制交替的标志 public static void main(String[] args) { // 打印数字的线程 new Thread(() -> { synchronized (lock) { for (int i = 1; i <= 26; i++) { while (!flag) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(i); flag = false; lock.notify(); } } }, "数字线程").start(); // 打印字母的线程 new Thread(() -> { synchronized (lock) { for (char c = 'A'; c <= 'Z'; c++) { while (flag) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.print(c + " "); flag = true; lock.notify(); } } }, "字母线程").start(); } } ``` **关键点解析**: 1. `synchronized (lock)`保证原子操作 2. `while (!flag)`防止虚假唤醒[^3] 3. `lock.wait()`释放锁并等待 4. `lock.notify()`唤醒对方线程 5. `flag`标志控制交替逻辑 --- #### 方法二:Lock + Condition(推荐) ```java import java.util.concurrent.locks.*; public class AlternatePrintV2 { private static Lock lock = new ReentrantLock(); private static Condition numberCond = lock.newCondition(); private static Condition letterCond = lock.newCondition(); private static boolean flag = true; public static void main(String[] args) { new Thread(() -> { lock.lock(); try { for (int i = 1; i <= 26; i++) { while (!flag) { numberCond.await(); } System.out.print(i); flag = false; letterCond.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }, "数字线程").start(); new Thread(() -> { lock.lock(); try { for (char c = 'A'; c <= 'Z'; c++) { while (flag) { letterCond.await(); } System.out.print(c + " "); flag = true; numberCond.signal(); } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } }, "字母线程").start(); } } ``` **优势分析**: 1. 使用两个Condition实现精准唤醒 2. 避免无效的线程竞争 3. 更细粒度的控制逻辑 4. 性能优于`synchronized`方案 --- #### 执行效果 两种方案输出均为: ``` 1 A 2 B 3 C ... 26 Z ``` --- #### 核心机制对比 | 特性 | synchronized方案 | Lock+Condition方案 | |--------------------|------------------|--------------------| | 唤醒精准度 | 唤醒所有等待线程 | 精准唤醒目标线程 | | 代码复杂度 | 简单 | 中等 | | 性能 | 一般 | 更 | | 可扩展性 | 弱 | 强(支持多个Condition)| ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lsky985

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值