最新java多线程试题-答案

合集下载

java多线程试题答案

java多线程试题答案

多线程一.选择题1.下列说法中错误地一项是()A.线程就是程序.线程是一个程序地单个执行流B.多线程是指一个程序地多个执行流.多线程用于实现并发2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态()A.等待阴塞状态下地线程被()唤B.等待阻塞状态下地纯种被()中断C.等待时间到D.等待阻塞状态下地线程调用()方法3.下列哪个方法可以使线程从运行状态进入其他阻塞状态()A.4.下列说法中错误地一项是()A.一个线程是一个类地实例B.线程从传递给纯种地实例()方法开始执行C.线程操作地数据来自实例D.新建地线程调用()方法就能立即进入运行状态5.下列关于类提供地线程控制方法地说法中,错误地一项是()A.在线程中执行线程地()方法,则线程等待直到执行完成B.线程通过调用()方法来中断其阻塞状态C.若线程调用方法()返回值为,则说明正在执行中D.()方法返回当前线程地引用6.下列说法中,错误地一项是()A.对象锁在()语句执行完之后由持有它地线程返还B.对象锁在()语句中出现异常时由持有它地线程返还C.当持有锁地线程调用了该对象地()方法时,线程将释放其持有地锁D.当持有锁地线程调用了该对象地构造方法时,线程将释放其持有地锁7.下面地哪一个关键字通常用来对对象地加锁,从而使得对对象地访问是排他地A.二.填空题. 在操作系统中,被称做轻型地进程是线程. 多线程程序设计地含义是可以将一个程序任务分成几个并行地任务. 在程序中,()方法地实现有两种方式:实现接口和继承类.多个线程并发执行时,各个线程中语句地执行顺序是确定地,但是线程之间地相对执行顺序是不确定地中地对象锁是一种独占地排他锁.程序中可能出现一种情况:多个线种互相等待对方持有地锁,而在得到对方地锁之前都不会释放自己地锁,这就是死锁b5E2R。

.线程地优先级是在类地常数和之间地一个值.处于新建状态地线程可以使用地控制方法是()和()..一个进程可以包含多个线程三.简答题.说明几个概念: 对象锁、、、、对象锁:每个对象都有对象锁,当某个线程进入用定义方法时,就获得了当前类对象(方法所属地类地对象)地锁,其他线程就不能再获得该锁,直到线程释放该锁.一个类对象有一个对象锁,多个同步方法公用一个对象锁.p1Ean。

java多线程实例练习题答案

java多线程实例练习题答案

java多线程实例练习题答案篇一:java线程练习及答案一、单选题(共有题目15题,共计30.0分)第三次练习题1Java语言的类间的继承关系是(B)A.多重的B.单重的C线程的D.不能继承2.下列选项中,用于在定义子类时声明父类名的关键字是(C)A.interfaceB.packageC.e某tendD.cla3.关于Java中异常的叙述正确的是(D)A.异常是程序编写过程中代码的语法错误B.异常是程序编写过程中代码的逻辑错误C.异常出现后程序的运行马上中止D.异常是可以捕获和处理的4.下面语句中哪一个不是用于异常处理的语句(B)。

A.tryB.breakC.catchD.finally5.下面是关于类及其修饰符的一些描述,不正确的是(D)。

A.abtract类只能用来派生子类,不能用来创建abtract类的对象B.final类不但可以用来派生子类,也可以用来创建final类的对象C.abtract不能与final同时修饰一个类D.abtract方法必须在abtract类中声明,但abtract类定义中可以没有abtract方法6.下面关于继承的哪个叙述是正确的。

(D)A.在java中允许多继承B.在java中一个类只能实现一个接口C.在java中一个类不能同时继承一个类和实现一个接口D.java的单一继承使代码更可靠7.在异常处理的语句中哪一个可以出现多次(C)。

A.tryB.breakC.catchD.finally8.在类的定义中构造函数的作用是(B)A.保护成员变量B.初始化成员变量C.描述类的特征D.读取类的成员变量9.下列选项中,用于在定义子类时声明父类名的关键字是(C)。

A.interfaceB.packageC.e某tendD.cla10.给出一段程序,试判断哪个是正确的结果。

(B)publicclaTet{publictaticvoidmain(Stringarg[]){try{Sytem.out.print(“Helloworld”);}finally{Sytem.out.println(“Finallye某ecuting”);}}}A.无法编译运行,因为没有指定异常B.无法编译运行,因为没有catch子句C.HelloworldD.HelloworldFinallye某ecuting11.给出下面的类定义:claA{publicint某;privateinty;claB{protectedvoidmethod1(){}claC{privatevoidmethod2(){}}}}claDe某tendA{publicfloatz;}方法method2()不能直接访问的是:(D)A类A中的变量某B.类A中的变量yC.类B中的method1()D.类D中的变量z12.以下关于异常捕获的原则中,错误的是(D)B.先列出子类,后列出父类。

JAVA 练习题第12章--java多线程机制

JAVA 练习题第12章--java多线程机制

连续输出10次带标号的“Hello!”


{
while(i++<10) { System.out.print(i+":Hello");


}
}

写出以下程序的功能: class TEST implements Runnable { public static void main(String args[]) {


TEST t=new TEST();
Thread tt=new Thread(t); tt.start(); }
改后才能符合A线程的需要,这时线程A就要等待 线程B完成修改工作,这种现象称为( ) A、线程的同步 B、线程的互斥 C、线程的调度 D、线程的就绪
A
最常使用的多线程实现方法是__________。
A、继承Thread类
B、继承Threader类 C、使用Runnable接口 D、使用Thread接口
C
线程在,新建和____
____状态调用isAlive()方法
返回的值是false。
死亡
7.在Java中,创建线程的方法有两种:
一种方法是通过(
另一种方法是通过(
)来实现, )来实现。
创建 Thread 类的子类 实现 Runnable 接口的类
8.(
)将启动线程对象,使之从新建状态转 入就绪状态并进入就绪队列排队。

Βιβλιοθήκη )。 A.线程一旦创建,则立即自动执行 B.线程创建后需要调用start()方法,将线程置于 可运行状态 C.调用线程的start()方法后,线程也不一定立即 执行 D.线程处于可运行状态,意味着它可以被调度 【解析】线程创建后需要调用start()方法,将线程 置于可运行状态。

java多线程练习题(打印版)

java多线程练习题(打印版)

java多线程练习题(打印版)### Java多线程练习题#### 题目一:实现一个简单的线程编写一个Java程序,创建一个线程,该线程打印出从1到10的数字。

```javapublic class SimpleThread extends Thread {public void run() {for (int i = 1; i <= 10; i++) {System.out.println(i);}}public static void main(String[] args) {SimpleThread thread = new SimpleThread();thread.start();}}```#### 题目二:线程同步编写一个Java程序,创建两个线程,它们交替打印字符串"A"和"B",直到每个线程打印5次。

```javapublic class ThreadSync {private static final Object lock = new Object();public static void main(String[] args) {Thread threadA = new Thread(() -> {for (int i = 0; i < 5; i++) {synchronized (lock) {System.out.print("A");lock.notify();try {lock.wait();} catch (InterruptedException e) { e.printStackTrace();}}}});Thread threadB = new Thread(() -> {for (int i = 0; i < 5; i++) {synchronized (lock) {System.out.print("B");lock.notify();try {lock.wait();} catch (InterruptedException e) { e.printStackTrace();}}}});threadA.start();threadB.start();}}```#### 题目三:生产者-消费者问题编写一个Java程序,模拟生产者-消费者问题。

Java 多线程编程练习题及答案

Java 多线程编程练习题及答案

Java 多线程编程练习题及答案一、多线程基础概念在开始进行Java多线程编程练习之前,首先需要了解一些多线程的基础概念。

1. 什么是线程?线程是计算机进程中的一个执行序列,可以独立运行,并与其他线程并发执行。

一个线程可以执行一个任务,它拥有自己的栈、程序计数器和本地变量等。

2. 为什么要使用多线程?多线程可以提高程序的执行效率,特别是在处理多任务时。

通过将多个任务拆分成多个线程,可以同时执行这些任务,从而加快整体的执行速度。

3. 如何创建线程?在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。

通过继承Thread类,需要重写run方法来定义线程的执行逻辑;通过实现Runnable接口,则需要实现run方法,并将Runnable对象传递给Thread类进行线程的创建。

二、多线程编程练习题现在,我们来进行一些多线程编程练习题,以巩固对多线程概念和编程的理解。

1. 编写一个程序,创建两个线程并使它们交替输出1-100的数字。

提示:可以使用一个标志变量来判断当前是哪个线程在执行,并使用synchronized关键字来保证线程之间的同步。

2. 编写一个程序,创建三个线程A、B和C,使它们运行10次,每次分别输出A、B和C,并等待随机时间后继续执行下一次。

提示:可以使用Thread.sleep()方法来模拟线程等待的时间。

3. 编写一个程序,模拟银行存取款操作。

创建两个线程,一个线程负责存款,另一个线程负责取款。

初始银行账户余额为1000元,存款线程每次存100元,取款线程每次取200元,两个线程分别执行10次。

提示:可以使用wait()和notify()方法来实现线程之间的等待和唤醒操作。

三、多线程编程练习答案下面是上述多线程编程练习题的答案,供参考。

1.```public class AlternatePrinting implements Runnable {private static int count = 1;private static final Object lock = new Object();private final int threadId;private final int totalThreads;private final int maxCount;public AlternatePrinting(int threadId, int totalThreads, int maxCount) {this.threadId = threadId;this.totalThreads = totalThreads;this.maxCount = maxCount;}@Overridepublic void run() {while (true) {synchronized (lock) {if (count > maxCount) {break;}if (count % totalThreads == threadId - 1) {System.out.println("Thread " + threadId + ": " + count);count++;} else {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}lock.notifyAll();}}}public static void main(String[] args) {int totalThreads = 2;int maxCount = 100;for (int i = 1; i <= totalThreads; i++) {new Thread(new AlternatePrinting(i, totalThreads, maxCount)).start();}}}```2.```public class ABCPrinting implements Runnable { private static final Object lock = new Object();private static String turn = "A";private final String name;private final int maxPrints;public ABCPrinting(String name, int maxPrints) { = name;this.maxPrints = maxPrints;}@Overridepublic void run() {int prints = 0;while (prints < maxPrints) {synchronized (lock) {try {while (!turn.equals(name)) {lock.wait();}System.out.println(name);prints++;if (turn.equals("A")) {turn = "B";} else if (turn.equals("B")) {turn = "C";} else {turn = "A";}lock.notifyAll();Thread.sleep((long) (Math.random() * 1000)); } catch (InterruptedException e) {e.printStackTrace();}}}}public static void main(String[] args) {int maxPrints = 10;new Thread(new ABCPrinting("A", maxPrints)).start(); new Thread(new ABCPrinting("B", maxPrints)).start(); new Thread(new ABCPrinting("C", maxPrints)).start(); }}```3.```public class BankOperation {private static final Object lock = new Object();private static int balance = 1000;public static void main(String[] args) {int numDeposits = 10;int numWithdrawals = 10;Thread depositThread = new Thread(() -> {for (int i = 0; i < numDeposits; i++) {synchronized (lock) {balance += 100;System.out.println("Deposit: 100, balance: " + balance);lock.notifyAll();}}});Thread withdrawalThread = new Thread(() -> {for (int i = 0; i < numWithdrawals; i++) {synchronized (lock) {if (balance < 200) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}balance -= 200;System.out.println("Withdrawal: 200, balance: " + balance); }}});depositThread.start();withdrawalThread.start();}}```四、总结在本篇文章中,我们通过多线程编程练习题的方式掌握了Java多线程的基础概念和编程技巧。

Java多线程题目及答案

Java多线程题目及答案

任务8 多线程编程一、实验目的1. 掌握线程的概念、线程的生命周期。

2. 掌握采用继承Thread 类创建子线程。

3. 掌握使用Runnable 接口使类线程化。

二、实验要求1.掌握线程的概念、线程的生命周期。

2.掌握使用Runnable 接口使类线程化。

三、实验内容一、输入以下源代码,多次运行程序,分析输出结果1. 继承Thread 类创建子线程public class MultiThreadExample{public static void main(String []args){new ThreadDemo("A").start();//启动线程Anew ThreadDemo("B").start();//启动线程B}}class ThreadDemo extends Thread{public ThreadDemo(String n){super(n); //线程名称}public void run(){for(int i=0;i<5;i++){try{// 睡眠一段随机时间Thread.sleep((long)(Math.random() * 1000));}catch(InterruptedException e){e.printStackTrace();}System.out.print(getName()); //打印线程名称}}}2. 使用Runnable 接口使类线程化class MyThread1 implements Runnable { // 实现Runnable接口创建线程类MyThread public void run() { // 实现Runnable接口的run()方法for (int i = 0; i < 9; i++) {System.out.println(Thread.currentThread().getName()+i + " ");}}}public class ThreadExample2 {public static void main(String args[]) {MyThread1 mt = new MyThread1(); // 创建线程类MyThread的实例tThread t = new Thread(mt); // 创建Thread类的实例tt.start(); // 启动线程for (int i = 0; i < 9; i++) {System.out.println(Thread.currentThread().getName()+i + " ");}}}3 多次运行以下程序public class Tst11 implements Runnable {private int x;private int y;public static void main(String[] args) {Tst11 t = new Tst11();new Thread(t).start();new Thread(t).start();}public void run() {for (int i=1;i<20;i++) {try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}x++;y++;System.out.println("x=" + x + ",y=" + y);}}}判断以上代码的运行结果是?A 编译不通过B 输出行类似x=1,y=1 ,总是重复一次。

Java多线程习题

Java多线程习题

Java多线程习题知识点:Java的多线程,实现多线程的两种方法,线程控制、调度方法一、选择题1、什么原因可导致线程停止执行。

()A.线程调用了 wait()方法;B.线程调用了yield()方法;C.线程调用了 pause()方法;D.线程调用了 sleep() 方法。

2、哪个方法是实现Runnable接口所需的?A.wait() B.run() C.stop() D.update() E.resume() 3、以下代码的调试结果为?()public class Bground extends Thread{public static void main(String argv[]){Bground b = new Bground();b。

run();}public void start(){for (int i = 0; i <10; i++){System。

out.println("Value of i = " + i);}}}A.编译错误,没有定义线程的run方法;B.由于没有定义线程的run方法,而出现运行错误;C。

编译通过,运行输出 values 0 to 9D。

编译通过,运行无输出4、有关线程的叙述正确的有:()A.通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定.B. 可以获得对任何对象的互斥锁定。

C。

线程通过调用对象的synchronized 方法可取得对象的互斥锁定。

D。

线程调度算法是平台独立的。

5、以下哪个是线程类的方法?A.yield()B. sleep(long msec)C。

go()D。

stop()6、以下哪个最准确描述synchronized关键字?A.允许两线程并行运行,而且互相通信;B. 保证在某时刻只有一个线程可访问方法或对象;C。

保证允许两个或更多处理同时开始和结束;D. 保证两个或更多线程同时开始和结束.7、于Java语言的内存回收机制,下列选项中最正确的一项是( )。

多线程经典笔试题

多线程经典笔试题

多线程经典笔试题一、多线程经典笔试题示例1. 题目一有一个主线程和多个子线程,子线程需要对一个共享变量进行操作,每次操作是对共享变量加1。

要求在不使用锁的情况下,保证共享变量的正确性。

(20分)答案:这种情况可以使用原子操作来保证共享变量的正确性。

在Java中,可以使用AtomicInteger类,它通过CAS(比较并交换)操作来实现原子性的加1操作。

解析:原子操作是不可中断的操作,在多线程环境下,它可以保证数据的一致性。

如果不使用原子操作,多个线程同时对共享变量进行加1操作时,可能会出现数据竞争的情况,导致结果不正确。

2. 题目二编写一个多线程程序,有三个线程分别打印A、B、C,要求按顺序打印ABC,循环10次。

(30分)答案:可以使用信号量或者Object的wait和notify方法来实现。

例如,使用Object的wait和notify方法时,可以创建一个共享对象,然后在每个线程中根据一定的逻辑进行等待和唤醒操作。

解析:这里的关键是要控制线程的执行顺序,通过让线程等待合适的时机再执行来达到按顺序打印的目的。

如果没有正确的等待和唤醒逻辑,就无法按顺序打印。

3. 题目三多线程中,如何避免死锁?请举例说明。

(25分)答案:避免死锁的方法有多种,比如按照相同的顺序获取锁、避免嵌套锁、使用定时锁等。

例如,假设有两个线程T1和T2,两个锁L1和L2。

如果T1先获取L1再获取L2,T2也先获取L1再获取L2,按照相同的顺序获取锁,就可以避免死锁。

解析:死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象。

按照相同顺序获取锁可以避免线程互相等待对方释放锁的情况。

4. 题目四解释多线程中的线程安全概念,并给出一个线程安全的类和一个非线程安全的类的例子。

(25分)答案:线程安全是指在多线程环境下,某个函数、函数库在被多个线程调用时,能够正确地处理各个线程的局部变量,使程序功能正确完成。

例如,在Java中,StringBuffer是线程安全的类,因为它的方法都是同步的;而StringBuilder是非线程安全的类。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多线程
一.选择题
1.下列说法中错误的一项是(A)
A.线程就是程序
B.线程是一个程序的单个执行流
B.多线程是指一个程序的多个执行流D.多线程用于实现并发
2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D)
A.等待阴塞状态下的线程被notify()唤
B.等待阻塞状态下的纯种被interrput()中断
C.等待时间到
D.等待阻塞状态下的线程调用wait()方法
3.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A)
A.sleep
B.wait
C.yield
D.start
4.下列说法中错误的一项是(D)
A.一个线程是一个Thread类的实例
B.线程从传递给纯种的Runnable实例run()方法开始执行
C.线程操作的数据来自Runnable实例
D.新建的线程调用start()方法就能立即进入运行状态
5.下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D)
A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成
B.线程A通过调用interrupt()方法来中断其阻塞状态
C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中
D.currentThread()方法返回当前线程的引用
6.下列说法中,错误的一项是()
A.对象锁在synchronized()语句执行完之后由持有它的线程返还
B.对象锁在synchronized()语句中出现异常时由持有它的线程返还
C.当持有锁的线程调用了该对象的wait()方法时,线程将释放其持有的锁
D.当持有锁的线程调用了该对象的构造方法时,线程将释放其持有的锁
7.下面的哪一个关键字通常用来对对象的加锁,从而使得对对象的访问是排他的 A
A.sirialize B transient C synchronized D static
二.填空题
1. 在操作系统中,被称做轻型的进程是线程
2. 多线程程序设计的含义是可以将一个程序任务分成几个并行的任务
3. 在Java程序中,run()方法的实现有两种方式:实现Runnable接口和继承Thread类
4 .多个线程并发执行时,各个线程中语句的执行顺序是确定的,但是线程之间的相对执行顺序是不确定的
6.Java中的对象锁是一种独占的排他锁
7.程序中可能出现一种情况:多个线种互相等待对方持有的锁,而在得到对方的锁之前都不会释放自己的锁,这就是死锁
8.线程的优先级是在Thread类的常数MIN_PRIORITY 和MAX_PRIORITY
之间的一个值
9.处于新建状态的线程可以使用的控制方法是start() 和stop() 。

10.一个进程可以包含多个线程
三.简答题
1.说明几个概念: 对象锁、sleep、wait、notify、notifyAll
对象锁:每个对象都有对象锁,当某个线程进入用synchronized定义方法时,就获得了当前类对象(方法所属的类的对象)的锁,其他线程就不能再获得该锁,直到线程释放该锁。

一个类对象有一个对象锁,多个同步方法公用一个对象锁。

sleep:是当前线程处于休眠状态,将对cpu的控制权交给其他线程,但不释放当前对象的锁,其他线程可以获得cpu,但不能进入当前线程控制的对象锁。

wait:与sleep的区别是,它会释放对象锁,其他线程可以进入该同步块。

notify:进入当前同步块的线程调用wait方法变成休眠状态的线程,notify将该线程变成等待状态。

notifyAll:进入当前同步块的线程调用wait方法变成休眠状态,notifyAll使所有休眠线程变成等待状态。

一个类中有多个同步方法,进入任意一个同步块都将获得该对象锁,由于wait方法使进入同步块的线程休眠,notify只能唤醒所有被休眠线程中的一个,notifyAll可以唤醒所有休眠线程。

通常线程的通信通过wait,notifyAll和wait条件来实现。

2. java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法 ? S
有两种实现方法,分别是继承 Thread类与实现Runnable接口
用synchronized关键字修饰同步方法
3. sleep() 和 wait() 有什么区别 ?
答: sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。

调用sleep不会释放对象锁。

wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

4. 同步和异步有何异同,在什么情况下分别使用他们?举例说明。

答:如果数据将在线程间共享。

例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。

当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

5. 启动一个线程是用 run() 还是 start()?
答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。

这并不意味着线程就会立即运行。

run()方法可以产生必须退出的标志来停止一个线程。

6. 多线程有几种实现方法 , 都是什么 ? 同步有几种实现方法 , 都是什么 ?
答:多线程有两种实现方法,分别是继承 Thread类与实现Runnable接口
同步的实现方面有两种,分别是synchronized,wait与notify
7. 线程的基本状态以及状态之间的关系
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。

相关文档
最新文档