多线程练习题卷
- 格式:doc
- 大小:88.50 KB
- 文档页数:12
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程序,模拟生产者-消费者问题。
多线程常见⾯试题及答案1、如何在Java中实现线程(4种)?1.继承Thread类,重写run⽅法(其实Thread类本⾝也实现了Runnable接⼝)2.实现Runnable接⼝,重写run⽅法3.实现Callable接⼝,重写call⽅法(有返回值)4.使⽤线程池(有返回值)2、在具体多线程编程实践中,如何选⽤Runnable还是Thread?Java中实现多线程有两种⽅法:继承Thread类、实现Runnable接⼝,在程序开发中只要是多线程,肯定永远以实现Runnable接⼝为主,因为实现Runnable接⼝相⽐继承Thread类有如下优势:1、可以避免由于Java的单继承特性⽽带来的局限;2、增强程序的健壮性,代码能够被多个线程共享,代码与数据是独⽴的;适合多个相同程序代码的线程区处理同⼀资源的情况。
3、Thread类中的start()和run()⽅法有什么区别?start()⽅法来启动线程,真正实现了多线程运⾏,这时⽆需等待run⽅法体代码执⾏完毕⽽直接继续执⾏下⾯的代码:通过调⽤Thread类的start()⽅法来启动⼀个线程,这时此线程是处于就绪状态,并没有运⾏。
然后通过此Thread类调⽤⽅法run()来完成其运⾏操作的,这⾥⽅法run()称为线程体,它包含了要执⾏的这个线程的内容,Run⽅法运⾏结束,此线程终⽌,⽽CPU再运⾏其它线程。
run()⽅法当作普通⽅法的⽅式调⽤,程序还是要顺序执⾏,还是要等待run⽅法体执⾏完毕后才可继续执⾏下⾯的代码:⽽如果直接⽤run⽅法,这只是调⽤⼀个⽅法⽽已,程序中依然只有主线程–这⼀个线程,其程序执⾏路径还是只有⼀条,这样就没有达到多线程的⽬的。
4、Java中Runnable和Callable有什么不同相同点:1. 两者都是接⼝;(废话)2. 两者都可⽤来编写多线程程序;3. 两者都需要调⽤Thread.start()启动线程;不同点:1. 两者最⼤的不同点是:实现Callable接⼝的任务线程能返回执⾏结果;⽽实现Runnable接⼝的任务线程不能返回结果;2. Callable接⼝的call()⽅法允许抛出异常;⽽Runnable接⼝的run()⽅法的异常只能在内部消化,不能继续上抛;注意点:Callable接⼝⽀持返回执⾏结果,此时需要调⽤FutureTask.get()⽅法实现,此⽅法会阻塞主线程直到获取‘将来’结果;当不调⽤此⽅法时,主线程不会阻塞!5、如何避免死锁?1. 加锁顺序按照顺序加锁是⼀种有效的死锁预防机制。
Android——多线程编程练习题随便选择两个城市作为预选旅游⽬标。
实现两个独⽴的线程分别显⽰10次城市名,每次显⽰后休眠⼀段随机时间(1000ms以内),哪个先显⽰完毕,就决定去哪个城市。
分别⽤Runnable接⼝和Thread类实现。
layout⽂件:1<?xml version="1.0" encoding="utf-8"?>2<LinearLayout xmlns:android="/apk/res/android"3 xmlns:tools="/tools"4 android:layout_width="match_parent"5 android:layout_height="match_parent"6 android:paddingBottom="@dimen/activity_vertical_margin"7 android:paddingLeft="@dimen/activity_horizontal_margin"8 android:paddingRight="@dimen/activity_horizontal_margin"9 android:paddingTop="@dimen/activity_vertical_margin"10 tools:context="com.hanqi.testapp2.PractiseActivity4"11 android:orientation="vertical">1213<TextView14android:layout_width="match_parent"15 android:layout_height="wrap_content"16 android:id="@+id/tvw1"/>17<TextView18android:layout_width="match_parent"19 android:layout_height="wrap_content"20 android:id="@+id/tvw2"/>2122<Button23android:layout_width="wrap_content"24 android:layout_height="wrap_content"25 android:id="@+id/btt1"26 android:text="随机选择"27 android:onClick="btn_onClick"/>28</LinearLayout>java类:1package com.hanqi.testapp2;23import android.os.Bundle;4import android.support.v7.app.AppCompatActivity;5import android.view.View;6import android.widget.Button;7import android.widget.TextView;8import android.widget.Toast;910public class PractiseActivity4 extends AppCompatActivity {1112 TextView tvw1;13 Button btt1;14 TextView tvw2;15 @Override16protected void onCreate(Bundle savedInstanceState) {17super.onCreate(savedInstanceState);18 setContentView(yout.activity_practise4);19 tvw1 = (TextView)findViewById(w1);20 btt1 = (Button)findViewById(R.id.btt1);21 tvw2 = (TextView)findViewById(w2);22 }23 String c1 = "北京";24 String c2 = "上海";25public void btn_onClick(View v)26 {27//创建⼦线程128new Thread(){29 @Override30public void run() {31for (int i=0;i<20;i++)32 {33if(i%2==0)34 {35 c1="";36 }37else38 {39 c1="北京";40 }41 runOnUiThread(new Runnable() {42 @Override43public void run() {44 tvw1.setText(c1);45 }46 });47//暂停48try {49 Thread.sleep((int) (Math.random()*1000));50 }51catch (Exception e)52 {5354 }55 }56 runOnUiThread(new Runnable() {57 @Override58public void run() {59 Toast.makeText(PractiseActivity4.this, c1 + "循环完成", Toast.LENGTH_SHORT).show();60 }61 });62 }63 }.start();64//创建⼦线程265new Thread(){66 @Override67public void run() {68for (int i=0;i<20;i++)69 {70if(i%2==0)71 {72 c2="";73 }74else75 {76 c2="上海";77 }78 runOnUiThread(new Runnable() {79 @Override80public void run() {81 tvw2.setText(c2);82 }83 });84//暂停85try {86 Thread.sleep((int) (Math.random()*1000));87 }88catch (Exception e)89 {9091 }92 }93 runOnUiThread(new Runnable() {94 @Override95public void run() {96 Toast.makeText(PractiseActivity4.this, c2 + "循环完成", Toast.LENGTH_SHORT).show();97 }98 });99 }100 }.start();101 }102103 }随便选择两个城市作为预选旅游⽬标。
多线程面试题c++ 4个线程设计问题
1.题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码子线程与主线程必有一个满足条件(flag == num),不满足条件的那个线程不可能获取unique_lock(会在wait中释放),只有满足条件的线程才能获取锁,执行程序
2.题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、
B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
3.题目(google笔试题):有四个线程1、2、3、4。
线程1的功能就是输出1,线程2的功能就是输出2,以此类推.........现在有四个文件ABCD。
初始都为空。
现要让四个文件呈如下格式:
A:1 2 3 4 1 2....
B:2 3 4 1 2 3....
C:3 4 1 2 3 4....
D:4 1 2 3 4 1....
4.题目:有一个写者很多读者,多个读者可以同时读文件,但写者在写文件时不允许有读者在读文件,同样有读者读时写者也不能写。
5.题目:编写程序完成如下功能:
1)有一int型全局变量g_Flag初始值为0
2)在主线称中起动线程1,打印“this is thread1”,并将g_Flag 设置为1
3)在主线称中启动线程2,打印“this is thread2”,并将g_Flag 设置为2
4)线程序1需要在线程2退出后才能退出
5)主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出。
java 多线程编程题
好的,以下是一个简单的Java 多线程编程题目:
题目:实现一个线程安全的计数器,当多个线程同时对计数器进行加1 操作时,计数器能够正确地累加计数。
要求:
1.计数器的初始值为0。
2.当多个线程同时对计数器进行加1 操作时,计数器能够正确地累加计数,保证计数
值的正确性。
3.使用synchronized 关键字保证计数器的线程安全性。
示例代码:
java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
在这个示例代码中,我们定义了一个名为Counter 的类,它包含一个名为count 的整型变量和一个名为increment 的方法。
increment 方法用于将count 变量的值加1,并使用synchronized 关键字保证其线程安全性。
我们还定义了一个名为getCount 的方法,它也使用了synchronized 关键字来保证线程安全性,用于返回当前的计数值。
考试参考答案一、单项选择题(从下列各题四个备选答案中选出一个正确答案,并将其代号写在答题纸相应位置处。
答案错选或未选者,该题不得分。
)1. D2. D3. B4. A5.A6. B7. A8. B9. B10.C11.D 12.A 13.D 14.A 15.C16.D 17.D 18.A 19.C 20.C21.C 22.C 23.B 24.A 25.C26. A 27. A 28. C29. B30.D31. A 32. D 33. D 34. C35.C36.C 37.A 38.C 39.C 40.C41.A 42.B 43.B 44.C 45.A46.B 47.B 48.C 49.B 50.C二、填空题1. ng.Thread2. 并发3.抢先调度4. stop()5. 死亡6. Thread7.可运行状态8.线程体9.返回线程的字符串信息10.用户11.寄存器12.虚拟的CPU 代码数据13.MAX_PRIORITY MIN_PRIORITY14.getPrority() setPrority()15.syschronized16.可运行状态阻塞状态17.封锁18.代码一组寄存器19.相互独立20.wait( )方法三、判断题(判断以下论述的正误,认为正确的就在答题相应位置划“T”,错误的划“F”)1. F2. T3. F4. F5. T6. T7. F8. T9.T 10. T11. F 12. T 13. T 14. F 15. T16. F 17. T 18. F 19.T 20. F四、简答题(回答要点,并简明扼要作解释)1. 答:线程是一段完成某个特定功能的代码,是程序中单个顺序的流控制。
但和进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而进程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。
2. 答:线程从创建、运行到销往的过程称为线程的生命周期。
java多线程试题————————————————————————————————作者:————————————————————————————————日期:狂翔IT工作室多线程试程一.选择题1.下列说法中,正确的一项是() AA.单处理机的计算机上,2个纯种一官半职直不能并发执行B.单处理机的计算机上,2个线程实际能够并发执行C.一个线程可以包含多个线程D.一个进程只能包含一个线程2.下列说法中错误的一项是()AA.线程就是程序B.线程是一个程序的单个执行流B.多线程是指一个程序的多个执行流D.多线程用于实现并发3.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D)A.等待阴塞状态下的线程被notify()唤B.等待阻塞状态下的纯种被interrput()中断C.等待时间到D.等待阻塞状态下的线程调用wait()方法4.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A)A.sleepB.waitC.yieldD.start5.下列不是进程组成部分的一项是(D)A.代码B.数据C.内核状态D.显示器6.下列哪一个不属于java线程模型的组成部分(D)A.虚拟的CPUB.虚拟CPU执行的代码C. 代码所操作的数据D.执行流7.下列说法中错误的一项是(C)A.Java中的第一个线程都属于某个线程组B.线程只能在其创建时设置所属的线程组C.线程创建之后,可以从一个线程组转移到另一个线程组D.新建的线程默认情况下属于其父线程所属的线程组8.下列不属于线程组成部分的一项是(C)A.程序计数器B.堆栈C. 进程地十空间中的代码D.栈指针9.下列关于JA V A线程模型的说法中,错误的一项是(A)A.Java线程模型包括计算机的CPUB.代码可以与其他线程共享C. 数据可以被多个线程共享D.线程模型在ng.Thread类中被定义10.下列说法中错误的一项是(D)A.一个线程是一个Thread类的实例B.线程从传递给纯种的Runnable实例run()方法开始执行C.线程操作的数据来自Runnable实例D.新建的线程调用start()方法就能立即进入运行状态11.下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D)A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成B.线程A通过调用interrupt()方法来中断其阻塞状态C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中D.currentThread()方法返回当前线程的引用12.下列说法中,错误的一项是()A.对象锁在synchronized()语句执行完之后由持有它的线程返还B.对象锁在synchronized()语句中出现异常时由持有它的线程返还C.当持有锁的线程调用了该对象的wait()方法时,线程将释放其持有的锁D.当持有锁的线程调用了该对象的构造方法时,线程将释放其持有的锁13.下面的哪一个关键字通宵用来对对象的加锁,从而使得对对象的访问是排他的 AA.sirialize B transient C synchronized D static14.下列关于线程的说法以中,正确的一项是(D)A.由同一类创建的多个线程都同时运行结束B.创建线程只能通过继承ng.Thread类C.调用suspend()方法暂停的一个线程将不会再被重新执行D.程序的执行完毕与超级线程(daemon threads)无关15.下列说法中错误的一项是(C)A.可串行化的类必须实现Serializable接口B.可串行化的类中的静态变量可以不被串行化C.private数据访问权限能够限制数据不被串行化D.对象串行化使用java语言提供的默认机制16.下列说法中错误的一项是(C)A.可串行化的类必须实现Serializable接口B.可串行化的类中的静态变量可以不被串行化C.private数据访问权限能够限制数据不被串行化D.对象串行化java语言提供的默认机制17.下列说法中正确的一项是(A)A.代码和数据是进程的组成部分B.代码和数据是线程的组成部分C. 进程是轻型的线程D.线程中包括线程18. 下列说法中错误的一项是(C)A.java的纯种体由Thread类的run()方法定义B.线程创建时已经确定了提供线程体的对象C.在程序中通过调用Thread类的run()方法创建线程对象D.java中每一个线程都有自己的名字19. 下列说法中错误的一项是(B)A.共享数据的所有访问都必须使用synchronized加锁B.共享数据的访问不一定全部使用synchronized加锁C.所有的对共享数据的访问都是临界区D.临界区必须使用syschronized标识20.下列有关线程的叙述中正确的一项是(B)A.一旦一个线程被创建,它就立即开始运行B.使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行C.当一个线程因为抢占机制而停止运行时,它被放在可运行队列的前面D.一个线程可能因为不同的原因而终止并进入终止状态二.填空题1. 在操作系统中,被称做轻型的进程是线程2. 多线程程序设计的含义是可以将一个程序任务分成几个并行的任务3. 在Java程序中,run()方法的实现有两种方式:实现Runnable接口和继承Thread类4.线程的高度是指在单个CPU上以某种顺序运行多个线程5.多个线程并发执行时,各个线程中语句的执行顺序是确定的,但是线程之间的相对执行顺序是不确定的6.Java中的对象锁是一种独占的排他锁7.程序中可能出现一种情况:多个纯种互相等待对方持有的锁,而在得到对方的锁之前都不会释放自己的锁,这就是死锁.8. notyfyAll() 方法将对象wait pool中的所有纯种都移到lock pool中。
java多线程练习题Java多线程编程练习题[]选择题1.编写线程类,要继承的父类是:A:ObjectB:RunnableC:SerializableD:ThreadE:E某ception答2.编写线程类,可以通过实现那个接口来实现?A:RunnableB:ThrowableC:SerializableE:Cloneable答:3.什么方法用于终止一个线程的运行?A:leepB:joinC:waitD:topE:notify答:4.一个线程通过什么方法将处理器让给另一个优先级别相同的线程?A:waitB:yieldC:joinD:leepE:top答:5.如果要一个线程等待一段时间后再恢复执行此线程,需要调用什么方法?A:waitB:yieldC:joinD:leepE:topF:notify答:6.什么方法使等待队列中的第一个线程进入就绪状态?A:waitB:yieldC:joinD:leepE:topF:notify答:7.Runnable接口定义了如下哪些方法?A:tart()B:top()C:reume()D:run()E:upend()答:8.如下代码创建一个新线程并启动线程:Runnabletarget=newMyRunnable();ThreadmyThread=newThread(target);问:如下哪些类可以创建target对象,并能编译正确?A:publicclaMyRunnablee某tendRunnable{publicvoidrun(){}} B:publicclaMyRunnablee某tendObject{publicvoidrun(){}}C:publicclaMyRunnableimplementRunnable{publicvoidrun(){}} D:publicclaMyRunnablee某tendRunnable{voidrun(){}}E:publicclaMyRunnableimplementRunnable{voidrun(){}}答:9.给出代码如下:publicclaMyRunnableimplementRunnable{publicvoidrun(){--------------------------------}}问在虚线处,如下哪些代码可以创建并启动线程?A:newRunnable(MyRunnable).tart();B:newThread(MyRunnable).run();C:newThread(newMyRunnable()).tart();D:newMyRunnable().tart();答:[]问答题1.线程和进程有什么区别?2.Java创建线程的方式有哪些?[]编程题1.编写多线程应用程序,模拟多个人通过一个山洞的模拟。
7 Java 多线程机制7.1 单项选择题1. 线程调用了sleep ()方法后,该线程将进入( )状态。
A. 可运行状态B. 运行状态C. 阻塞状态D. 终止状态2. 关于java 线程,下面说法错误的是()A. 线程是以CPU为主体的行为B. java 利用线程使整个系统成为异步C. 创建线程的方法有两种:实现Runnable 接口和继承Thread 类D. 新线程一旦被创建,它将自动开始运行3. 在java 中的线程模型包含()A. 一个虚拟处理器B. CPU执行的代码C. 代码操作的数据D. 以上都是4. 在java 语言中,临界区可以是一个语句块,或者是一个方法,并用()关键字标识。
A. synchronizedB. includeC. importD. Thread5. 线程控制方法中,yield()的作用是()A. 返回当前线程的引用B. 使比其低的优先级线程执行C. 强行终止线程D. 只让给同优先级线程运行6. 线程同步中,对象的锁在()情况下持有线程返回A. 当synchronized()语句块执行完后B. 当在synchronized()语句块执行中出现例外( exception )时C. 当持有锁的线程调用该对象的wait()方法时D. 以上都是7. 在以下()情况下,线程就进入可运行状态A. 线程调用了sleep()方法时B. 线程调用了join()方法时C. 线程调用了yield()方法时D. 以上都是8. java 用()机制实现了进程之间的异步执行A. 监视器B. 虚拟机C. 多个CPUD. 异步调用9. Thread 类的方法中,toString() 方法的作用是()A. 只返回线程的名称B. 返回当前线程所属的线程组的名称C. 返回当前线程对象D. 返回线程的名称10. J ava 语言具有许多优点和特点,下列选项中,哪个反映了Java 程序并行机制的特点( )A. 安全性B. 多线程C. 跨平台D. 可移值11. 以下哪个关键字可以用来对对象加互斥锁()A. transientB. synchronizedC. serializeD. static12. 下面关于进程、线程的说法不正确的是( )。
多线程一、单项1.下述哪个选项为真?( )A.Error类是一个RoutimeException异常B.任何抛出一个RoutimeException异常的语句必须包含在try块之内C.任何抛出一个Error对象的语句必须包含在try块之内D. 任何抛出一个Exception异常的语句必须包含在try块之内2.下列关于Java线程的说法哪些是正确的?( )A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题C.Thread类属于java.util程序包D.以上说法无一正确3.哪个关键字可以对对象加互斥锁?( )A.transientB.synchronizedC.serializeD.static4.下列哪个方法可用于创建一个可运行的类?()A.public class X implements Runable { public void run() {……} }B. public class X implements Thread { public void run() {……} }C. public class X implements Thread { public int run() {……} } D.public class X implements Runable { protected void run() {……} }5.下面哪个选项不会直接引起线程停止执行?( )A.从一个同步语句块中退出来B.调用一个对象的wait方法C.调用一个输入流对象的read方法D.调用一个线程对象的setPriority方法6.使当前线程进入阻塞状态,直到被唤醒的方法是( )A.resume()方法B.wait()方法C.suspend()方法D.notify()方法7.运行下列程序,会产生的结果是( )public class X extends Thread implements Runnable {public void run(){System.out.println(“this is run()”);}public static void main(String[] args){Thread t=new Thread(new X());t.start();}}A.第一行会发生编译错误B. 第六行会发生编译错误C.第六行会发生运行错误D.程序会运行和启动ng.ThreadGroup类的作用为 ( )A.使任何类都可以为线程提供线程体B.定义了线程与交互的方法C.提供了线程组或组中的每个线程进行操作的方法D.以上都不是9.实现线程的创建有( )方法A.一种 B. 两种 C.三种 D.四种10.一个进程可以包含( )个线程A.一B. 二C. 三D.四11.Java中的线程模型包含( )A.一个虚拟处理机B.CPU执行的代码C.代码操作的数据D.以上都是12.关于线程组以下说法错误的是( )A.在应用程序中线程可以独立存在,不一定要属于某个线程B.一个线程只能创建时设置其线程组C.线程组由ng包中的ThreadGroup类实现D.线程组使一组线程可以作为一个对象进行统一处里或维护13.下列定义线程方法正确的是( )A.Public Thread();B.Public Thread(Runnable target);C.Public Thread(ThreadGroup group,Runnable target);D.以上都正确14.以下不属于Thread类提供的线程控制方法是( )A.break()B.sleep()C.yield()D.join()15.下列关于线程的说法正确的是( )A.线程就是进程B.线程在操作系统出现后就产生了C.Soloris是支持线程的操作系统D.在单处理器和多处理器上多个线程不可以并发执行16.下列不属于线程生命周期状态的是( )A. 新建状态B.可运行状态C. 运行状态D.解锁状态17.以下不属于Thread类的线程优先级静态常量的是( )A.MIN_PRIORITYB.MAX__PRIORITYC.NORM__PRIORITYD.BEST__PRIORITY18.( )关键字可以对对象加互斥锁。
java多线程选择题练习题一、填空题1、线程运行时将执行(start)方法中的代码。
02、在Java语言中,可以通过继承(Thread)类和实现(Runnable)接口来创建多线程。
3、使线程处于睡眠,使用(sleep )方法,将目前正在执行的线程暂停使用(wait)方法,取得当前线程名称采用(getName)方法。
4、Java语言中,采用(代码块)同步和(方法)同步解决死锁问题。
二、选择题1、当多个线程对象操作同一资源是,使用(B )关键字进行资源同步。
A transientB synchronizedC publicD static2、终止线程使用(D )方法。
A sleep()B yield()C wait()D destroy()三、简答题1、简述线程的生命周期。
Java语言使用Thread类及其子类的对象来表示线程,新建线程在它的一个完整生命周期内通常会经历5中状态——新建状态、就绪状态、运行状态、阻塞状态、消亡状态。
每个Java程序都有一个缺省的主线程。
对于Application,主线程是main()方法执行的线索。
2、什么是线程同步,并举例说明。
同步就是指多个操作在同一个时间段内只能有一个线程对共享资源进行操作,其它线程只有等到此线程对该资源的控制完成之后才能对共享资源进行操作。
举例:火车票预定过程如果当前的剩余票为1,则线程t1(表示一个预定用户)执行到了图所示的位置,而这时候因为该程序代码资源被其它线程共享,有可能线程t2(另一个预订用户)执行到了图所示的位置,当t2执行ticket--之后,ticket的值为0,而随后t1也会执行到刚才t2执行的位置,因此t1的输出结果为0。
出现上面问题的根本原因是程序代码被多个线程共享而交替运行,解决该问题关键是确保共享的代码块在某个时间只能被一个线程所拥有。
在Java语言中,利用同步解决该问题。
3、简述线程与进程的区别。
进程是程序的一次运行过程,因此进程是动态的。
多线程面试题及答案多线程是面试中常常涉及的一个重要话题。
面试官会通过提问关于多线程的问题来评估你对于并发编程的理解程度以及解决并发问题的能力。
下面是一些常见的多线程面试题及其答案。
1. 什么是线程?什么是多线程?答:线程是指操作系统能够进行运算调度的最小单位。
多线程是指在一个程序中运行多个线程,每个线程可以并发执行不同的任务。
2. 线程和进程有什么区别?答:线程是进程的子任务,一个进程可以包含多个线程。
进程拥有独立的内存空间,而线程共享同一进程的内存空间。
线程之间的切换比进程之间的切换更加高效。
3. 什么是线程安全?答:线程安全是指当多个线程同时访问一个共享资源时,保证该资源在并发情况下仍然能够正常工作,不会产生不一致或者异常的结果。
4. 如何创建线程?答:创建线程的方式有两种:继承Thread类和实现Runnable接口。
继承Thread类需要重写run()方法,实现Runnable接口需要实现run()方法。
可以通过调用start()方法来启动线程。
5. 什么是线程同步?答:线程同步是指多个线程之间按一定的顺序访问共享资源。
通过线程同步可以避免多个线程同时修改一个共享资源而引发的数据不一致的问题。
6. 什么是死锁?答:死锁是指两个或多个线程无限期地等待彼此持有的资源的情况。
当多个线程都在等待对方释放资源时,系统无法继续执行。
7. 如何避免死锁?答:避免死锁的方法有:避免使用多个锁;按照相同的顺序获取锁;设置超时时间;使用资源分级的方式。
8. 什么是线程池?答:线程池是一种线程复用的机制。
它包含一个线程队列,用于存放任务,并提供一种调度机制,控制并发的线程数。
9. 什么是线程安全的集合?答:线程安全的集合是在多线程环境下使用的数据结构,保证多个线程对集合的操作不会出现数据不一致的情况。
例如,线程安全的集合包括ConcurrentHashMap、ConcurrentLinkedQueue等。
10. 什么是死锁检测?答:死锁检测是一种机制,用于发现并解决死锁问题。
java 多线程练习题Java多线程练习题在Java中,多线程是非常常见和重要的概念。
通过使用多线程,我们可以实现并发处理和同时执行多个任务。
为了熟悉和掌握多线程的用法,下面将给出一些Java多线程的练习题。
1. 编写一个Java程序,创建两个线程,分别输出从1到50和从51到100的数字。
确保两个线程交替输出数字,即输出的结果应为:1,51,2,52,3,53...,99,100。
2. 编写一个Java程序,创建三个线程,分别输出字符A、字符B和字符C。
确保三个线程按顺序交替输出字符,即输出的结果应为:ABCABCABC...3. 编写一个Java程序,模拟购票系统。
假设有100张票,多个窗口同时售票,要求保证售出的票没有重复,即每张票只能卖给一个人。
4. 编写一个Java程序,使用多线程实现生产者-消费者模型。
假设有一个信号灯,生产者线程可以向信号灯放置数据,消费者线程可以从信号灯中取走数据。
要求生产者线程和消费者线程交替执行,确保生产者放置数据后,消费者才能取走数据。
5. 编写一个Java程序,使用多线程计算1到100之间所有数字的和。
要求将任务分成10个子任务,由10个线程并行地执行,并最后将子任务的计算结果合并得到最终结果。
6. 编写一个Java程序,实现一个简单的线程池。
线程池中包含固定数量的线程,多余的任务将会排队等待执行。
当新的任务到达时,如果有空闲线程,则立即执行,否则任务将会进入等待队列。
以上是一些Java多线程的练习题,通过完成这些练习题,您将熟悉和掌握多线程的基本用法和常见应用场景。
希望这些练习题对您的学习和实践有所帮助!。
1.在Java中,以下哪个类提供了创建线程的构造器?o A. Threado B. Runnableo C. Callableo D. ExecutorService答案: A解析: Thread类在Java中提供了创建线程的构造器,可以用于实例化线程对象。
2.下列哪个是C语言中创建进程的函数?o A. pthread_createo B. forko C. execo D. wait答案: B解析: fork函数用于在C语言中创建新的进程。
3.在Java中,如果一个线程调用了另一个线程的join方法,那么调用线程将处于什么状态?o A. 运行状态o B. 就绪状态o C. 阻塞状态o D. 死亡状态答案: C解析: 调用join方法的线程会进入阻塞状态,直到被join的线程运行结束。
4.以下哪个关键字用于在C语言中创建线程?o A. threado B. create_threado C. _threado D. pthread_create答案: D解析: pthread_create是POSIX线程库提供的创建线程的关键函数。
5.Java中,以下哪个方法可以获取当前线程的ID?o A. getCurrentThreadID()o B. Thread.currentThread().getId()o C. Id()o D. getId()答案: B解析: Thread.currentThread().getId()用于获取当前线程的ID,currentThread()返回当前正在执行的线程的Thread对象。
6.在多线程编程中,以下哪个关键字可以用于实现线程互斥?o A. volatileo B. synchronizedo C. statico D. final答案: B解析: synchronized关键字用于在Java中实现线程互斥,确保同一时间只有一个线程可以访问特定的代码块或方法。
多线程一、单项1.下述哪个选项为真?()A.Error类是一个RoutimeE*ception异常B.任何抛出一个RoutimeE*ception异常的语句必须包含在try块之C.任何抛出一个Error对象的语句必须包含在try块之D. 任何抛出一个E*ception异常的语句必须包含在try块之2.以下关于Java线程的说法哪些是正确的?()A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3局部组成B.创立线程的两种方法,从Thread类中继承的创立方式可以防止出现多父类问题C.Thread类属于java.util程序包D.以上说法无一正确3.哪个关键字可以对对象加互斥锁?()A.transientB.synchronizedC.serializeD.static4.以下哪个方法可用于创立一个可运行的类“()A.public class * implements Runable { public void run() {……} }B. public class * implements Thread { public void run() {……} }C. public class * implements Thread { public int run() {……} } D.public class * implements Runable { protected void run() {……} }5.下面哪个选项不会直接引起线程停顿执行?()A.从一个同步语句块中退出来B.调用一个对象的wait方法C.调用一个输入流对象的read方法D.调用一个线程对象的setPriority方法6.使当前线程进入阻塞状态,直到被唤醒的方法是()A.resume()方法B.wait()方法C.suspend()方法D.notify()方法7.运行以下程序,会产生的结果是()public class * e*tends Thread implements Runnable {public void run(){System.out.println(“this is run()〞);}public static void main(String[] args){Thread t=new Thread(new *());t.start();}}A.第一行会发生编译错误B. 第六行会发生编译错误C.第六行会发生运行错误D.程序会运行和启动ng.ThreadGroup类的作用为()A.使任何类都可以为线程提供线程体B.定义了线程与交互的方法C.提供了线程组或组中的每个线程进展操作的方法D.以上都不是9.实现线程的创立有()方法A.一种 B. 两种 C.三种 D.四种10.一个进程可以包含()个线程A.一B. 二C. 三D.四11.Java中的线程模型包含()A.一个虚拟处理机B.CPU执行的代码C.代码操作的数据D.以上都是12.关于线程组以下说法错误的选项是()A.在应用程序中线程可以独立存在,不一定要属于*个线程B.一个线程只能创立时设置其线程组C.线程组由ng包中的ThreadGroup类实现D.线程组使一组线程可以作为一个对象进展统一处里或维护13.以下定义线程方确的是()A.Public Thread();B.Public Thread(Runnable target);C.Public Thread(ThreadGroup group,Runnable target);D.以上都正确14.以下不属于Thread类提供的线程控制方法是()A.break()B.sleep()C.yield()D.join()15.以下关于线程的说确的是()A.线程就是进程B.线程在操作系统出现后就产生了C.Soloris是支持线程的操作系统D.在单处理器和多处理器上多个线程不可以并发执行16.以下不属于线程生命周期状态的是()A. 新建状态B.可运行状态C. 运行状态D.解锁状态17.以下不属于Thread类的线程优先级静态常量的是()A.MIN_PRIORITYB.MA*__PRIORITYC.NORM__PRIORITYD.BEST__PRIORITY18.()关键字可以对对象加互斥锁。
多线程一.选择题1.下列说法中错误的一项是(A)A.线程就是程序B.线程是一个程序的单个执行流B.多线程是指一个程序的多个执行流D.多线程用于实现并发2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D)A.等待阴塞状态下的线程被notify()唤B.等待阻塞状态下的纯种被interrput()中断C.等待时间到D.等待阻塞状态下的线程调用wait()方法3.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A)A.sleepB.waitC.yieldD.start4.下列说法中错误的一项是(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.下面的哪一个关键字通常用来对对象的加锁,从而使得对对象的访问是排他的 AA.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() 。
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. 保证两个或更多线程同时开始和结束。
线程练习题一、选择题(每题2分,共20分)1. 在Java中,哪个关键字用于声明线程类?A. publicB. staticC. synchronizedD. extends Thread2. 以下哪个方法用于启动线程?A. start()B. run()C. stop()D. destroy()3. Java中,线程的优先级范围是多少?A. 0-5B. 1-10C. 0-10D. 1-1004. 在Java中,哪个类提供了创建线程的另一种方式?A. ThreadB. RunnableC. ExecutorD. Callable5. 线程的生命周期中,哪个状态表示线程已经完成执行?A. NEWB. RUNNABLEC. TERMINATEDD. BLOCKED6. 在Java中,哪个方法可以暂停线程的执行?A. sleep()B. yield()C. stop()D. wait()7. 以下哪个是线程同步的方法?A. synchronizedB. volatileC. transientD. final8. 哪个方法可以中断线程?A. stop()B. interrupt()C. suspend()D. destroy()9. 在Java中,哪个类提供了线程池的功能?A. ThreadB. RunnableC. ExecutorServiceD. Callable10. 以下哪个方法可以获取当前线程的名称?A. getName()B. getPriority()C. getId()D. isAlive()二、简答题(每题10分,共40分)1. 简述线程和进程的区别。
2. 描述Java中线程的生命周期。
3. 解释什么是死锁,并给出避免死锁的策略。
4. 举例说明如何使用Java的线程池。
三、编程题(每题20分,共40分)1. 编写一个Java程序,创建两个线程,一个线程打印数字序列0到10,另一个线程打印字母序列'A'到'J'。
多线程练习题1.使⽤多线程,模拟龟兔赛跑的场景。
按照以往的故事经验,正确的故事逻辑顺序当然是因为兔⼦不把乌龟放在眼⾥,松懈了最终输了⽐赛。
我的设定也是如此,假定乌龟每秒跑五⽶(是有点快但为了线程的运⾏速度来看还是写快点)兔⼦的速度为每秒⼗⽶。
但是兔⼦在跑到⼀半休息了⼀点五秒。
代码如下:package pany;public class ThreadTest1 implements Runnable{public void run(){try {for(int i = 1;i<=100;i= i+5){System.out.println("乌龟跑了"+i+"⽶");Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();}}}package pany;public class ThreadTest2 implements Runnable{public void run(){try {for(int j = 1;j<=100;j=j+10){System.out.println("兔⼦跑了"+j+"⽶");Thread.sleep(1000);if(j==51){Thread.sleep(15000);}}} catch (InterruptedException e) {e.printStackTrace();}}}package pany;import ;public class ThreadMain {static int a = 200;public static void main(String[] args) {ThreadTest1 threadTest1 = new ThreadTest1();ThreadTest2 threadTest2 = new ThreadTest2();Thread thread1 = new Thread(threadTest1);Thread thread2 = new Thread(threadTest2);thread1.start();thread2.start();}}运⾏结果如下:2、编写⼀个有两个线程的程序,第⼀个线程⽤来计算2~100000之间的素数的个数,第⼆个线程⽤来计算100000~200000之间的素数的个数,最后输出结果。
多线程一、单项选择题(从下列各题四个备选答案中选出一个正确答案,并将其代号写在答题纸相应位置处。
答案错选或未选者,该题不得分。
)501.下述哪个选项为真?( )A.Error类是一个RoutimeException异常B.任何抛出一个RoutimeException异常的语句必须包含在try块之内C.任何抛出一个Error对象的语句必须包含在try块之内D. 任何抛出一个Exception异常的语句必须包含在try块之内2.下列关于Java线程的说法哪些是正确的?( )A.每一个Java线程可以看成由代码、一个真实的CPU以及数据3部分组成B.创建线程的两种方法,从Thread类中继承的创建方式可以防止出现多父类问题C.Thread类属于java.util程序包D.以上说法无一正确3.哪个关键字可以对对象加互斥锁?( )A.transientB.synchronizedC.serializeD.static4.下列哪个方法可用于创建一个可运行的类?()A.public class X implements Runable { public void run() {……} }B. public class X implements Thread { public void run() {……} }C. public class X implements Thread { public int ru n() {……} }D.public class X implements Runable { protected void run() {……} }5.下面哪个选项不会直接引起线程停止执行?( )A.从一个同步语句块中退出来B.调用一个对象的wait方法C.调用一个输入流对象的read方法D.调用一个线程对象的setPriority方法6.使当前线程进入阻塞状态,直到被唤醒的方法是( )A.resume()方法B.wait()方法C.suspend()方法D.notify()方法7.运行下列程序,会产生的结果是( )public class X extends Thread implements Runnable {public void run(){System.out.println(“this is run()”);}public static void main(String[] args){Thread t=new Thread(new X());t.start();}}A.第一行会发生编译错误B. 第六行会发生编译错误C.第六行会发生运行错误D.程序会运行和启动ng.ThreadGroup类的作用为( )A.使任何类都可以为线程提供线程体B.定义了线程与交互的方法C.提供了线程组或组中的每个线程进行操作的方法D.以上都不是9.实现线程的创建有( )方法A.一种B. 两种 C.三种 D.四种10.一个进程可以包含( )个线程A.一B. 二C. 三D.四11.Java中的线程模型包含( )A.一个虚拟处理机B.CPU执行的代码C.代码操作的数据D.以上都是12.关于线程组以下说法错误的是( )A.在应用程序中线程可以独立存在,不一定要属于某个线程B.一个线程只能创建时设置其线程组C.线程组由ng包中的ThreadGroup类实现D.线程组使一组线程可以作为一个对象进行统一处里或维护13.下列定义线程方法正确的是( )A.Public Thread();B.Public Thread(Runnable target);C.Public Thread(ThreadGroup group,Runnable target);D.以上都正确14.以下不属于Thread类提供的线程控制方法是( )A.break()B.sleep()C.yield()D.join()15.下列关于线程的说法正确的是( )A.线程就是进程B.线程在操作系统出现后就产生了C.Soloris是支持线程的操作系统D.在单处理器和多处理器上多个线程不可以并发执行16.下列不属于线程生命周期状态的是( )A. 新建状态B.可运行状态C. 运行状态D.解锁状态17.以下不属于Thread类的线程优先级静态常量的是( )A.MIN_PRIORITYB.MAX__PRIORITYC.NORM__PRIORITYD.BEST__PRIORITY18.( )关键字可以对对象加互斥锁。
A.synchronizedB.transientC.serializeD.static19.下列( )方法和resume()方法相互搭配,使线程停止执行,然后调用resume()方法恢复线程。
A.interrupt()B.stop()C.suspend()D.yield()20.Thread类的方法中,getName()方法的作用是( )A.返回线程组的名称B.设置线程组的名称C.返回线程的名称D.设置线程的名称21.线程调用了sleep()方法后,该线程将进入( )状态A.可运行状态B.运行状态C.阻塞状态D.终止状态22.下列( )类或接口定义了线程同步与交互的方法。
A.ThreadB.RunnableC.ObjectD.ThreadGroup23.Java中线程是由线程类的( )方法定义的。
A.init()B.run()C.application()D.main()24.线程控制方法中,stop()的作用是( )A.强行终止线程B.使比其低的优先级线程运行C.只让给同优先级运行D.返回当前线程的引用25.在以下( )情况下,线程就进入可运行状态。
A.线程调用了sleep()方法时B.线程调用了join()方法时C.线程调用了yield()方法时D.以上都是26.下列说法中,正确的一项是()A.单处理机的计算机上,2个线程实际上不能并发执行B.单处理机的计算机上,2个线程实际上能够并发执行C.一个线程可以包含多个进程D.一个进程可以包含多个线程27.下列说法中错误的一项是()A.线程就是程序B.线程是一个程序的单个执行流C.多线程是指一个程序的多个执行流D.多线程用于实现并发28.下列关于Thread类的线程控制方法的说法中错误的一项是()A.线程可以通过调用sleep()方法使比当前线程优先级的线程运行B.线程可以通过调用yield()方法和当前线程优先级一样的线程运行C.线程sleep()方法调用结束后,该线程进入运行状态D.若没有相同优先级的线程处于可运行状态,县城调用yield()方法时,当前线程将继续执行30.下列哪一个操作不能使线程从等待阻塞状态进入对象锁阻塞状态?A.等待阻塞状态下的线程被notify()唤醒B.等待阻塞状态下的线程被interrput()中断C.等待时间到D.等待阻塞状态下的进程调用wait()方法31.下列哪一个方法可以使线程从运行状态进入其他阻塞状态?A. sleep()B. wait()C. yield()D. start()32.下列哪一个不属于Java线程模型的组成部分?A.虚拟的CPUB.虚拟CPU执行的代码C.代码所操作的数据D.执行流B.输出“INTERRUPTED”C.输出“DONE WAITING”D.编译通过,但是不输出任何字符串34.下列哪一种情况一定不会使当前的线程暂停执行?()A.该线程抛出一个InterruptedExceptionB.该线程调用sleep()方法C.该线程创建一个新的子线程D.该线程从输入流读取文件数据35.下列说法中错误的一项是()A.Java中的每一个线程都属于某个线程组B.线程只能在其创建时设置所属的线程组C.线程创建之后,可以从一个线程组转移到另一个线程组D.新建的线程组默认情况下属于其父线程所属的线程组36.下列不属于线程组成部分的一项是()A. 程序计数器B. 堆栈C. 进程地址空间中的代码 C. 栈指针37.下列关于Java线程模型的说法中,错误的一项是()A.Java线程模型包括了计算机的CPUB.代码可以与其他线程共享C.数据可以被多个线程共享D.线程模型在ng.Thread类中被定义38.下列关于Thread类提供的线程控制方法的说法中,错误的一项是()A.在线程a中执行线程b的join()方法,则线程a等待直到b执行完成B.线程a通过调用interrupt()方法来中断其阻塞状态C.若线程a调用方法isAlive()返回值为true,则说明a正在执行中D.currentThread()方法返回当前线程的引用39.下面的哪一个关键字通常用来对对象加锁,从而使得对对象的访问是排他的?()A. serializeB. transientC. synchronizedD. static40.下列说法中错误的一项是()A.可串行化的类必须实现Serializable接口B.可串行化的类中的静态变量可以不被串行化C.private数据访问权限能够限制数据不被串行化D.对象串行化使用Java语言提供的默认机制41.下列说法中正确的一项是()A.代码和数据是进程的组成部分B.代码和数据是线程的组成部分C.进程是轻型线程D.线程中包含进程42.下列说法中错误的一项是()A.共享数据的所有访问都必须使用synchronized加锁B.共享数据的访问不一定全部使用synchronized加锁C.所有的对共享数据的访问都是临界区D.临界区必须使用synchronized标识43.下列有关线程的叙述中正确的一项是()A.一旦一个线程都创建,它就立即开始运行B.使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行C.当一个线程因为抢占机制而停止运行时,它被放在课运行队列的前面D.一个线程可能因为不同的原因停止并进入终止状态44.下列方法中,不属于Thread类提供的线程控制方法的一个是()A. sleep()B. interrupt()C. init()D. yield()45.实现Runnable接口创建一个线程的语句是()Thead t = new Thead (target)Thead t = new Thead ();t.target=targetThead t = new Thead ();T.start(target)Thead t = new Thead ();T.run(target)Thead类定义与下列哪一个包中?()A. java.ioB. ngC. java.utilD. java.awt46.下列说法中,错误的一项是()A.实现了Runnable接口的类,可以通过extends来继承其他的类B.实现了Runnable接口的类,不能继承其他的类C.Thread类的子类应该是关于CPU行为的类D.Thread类的子类也实现了Runnable接口47.下列是通过实现Runnable接口创建的类,其中正确的一项是()A. class A3 implements Runnable{void run(){//··········}}B. class A3 extends Runnable{public void run(){//··········}}C. class A3 implements Runnable{public void run(){//··········}}D. class A3 implements Runnable{//··········}48.Thread类的常量NORM_PRIORITY代表的优先级是()A.最低优先级B.普通优先级C.最高优先级D.不代表任何优先级50.下列哪一个包给出了Runnable接口的定义?()A. java.utilB. java.ioC. ngD. java.sql二、填空题201.线程模型在Java中是由________类进行定义和描述的。