经典多线程的练习题

合集下载

Java多线程习题

Java多线程习题
C、Java.1ang.ThreadD、java.1ang.Runnable
9、下列说法中错误的一项是( )。
A、Applet必须全部重写其生命周期方法
B、Applet不必全部重写其生命周期方法
C、Applet中使用了线程,则需要重写相应的生命周期方法
D、stop()总是在destroy()之前被调用。
B、用于建立与某个数据源的连接可采用DriverManager类的getConnection方法
C、建立数据库连接时,必须要进行异常处理
D JDBC中查询语句的执行方法必须采用Statement类实现
12、运行下列程序,会产生什么结果()
public class X extends Thread implements Runable{ public void run(){
18•实现线程体的方式除了继承Thread类,还可以实现接口。
E)A、Cloneable B、Runnable C、Iterable D、Serializable二、填空题
1、 若在高优先级线程的run()方法中调用_____方法,则该线程将让出CPU使其他 —
的线程获得CPU的使用权。
2、 通过实现Runnable接口创建线程的过程是:将实现Runnable的一个亠作为
Java
知识点:
Java的多线程,实现多线程的两种方法,线程控制、调度方法
一、选择题
1、什么原因可导致线程停止执行。 ( )
A.线程调用了wait()方法;
B.线程调用了yield()方法;
C.线程调用了pause()方法;
D.线程调用了sleep()方法。
2、 哪个方法是实现Runnable接口所需的?
13、下面哪个方法可以在任何时候被任何线程调用? ()

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程序,模拟生产者-消费者问题。

多线程练习题

多线程练习题

多线程练习题多线程练习题在计算机编程领域,多线程是一个重要的概念。

它允许程序同时执行多个任务,提高了程序的效率和响应性。

然而,多线程编程也带来了一些挑战,如线程同步、资源竞争等问题。

为了提高自己的多线程编程能力,下面我将给大家提供一些多线程练习题,希望能对大家有所帮助。

1. 线程创建与启动编写一个程序,创建两个线程,并让它们分别输出"Hello, World!"和"Goodbye, World!"。

2. 线程同步编写一个程序,创建两个线程,并让它们分别输出数字1到10。

要求线程1输出奇数,线程2输出偶数,并保证输出顺序正确。

3. 线程通信编写一个程序,创建两个线程,一个线程负责计算1到100的和,另一个线程负责计算101到200的和。

要求线程1计算完成后,线程2再开始计算,并在计算完成后输出结果。

4. 线程池编写一个程序,使用线程池来计算1到100的平方和。

要求使用固定大小的线程池,并输出每个线程计算的结果。

5. 线程安全编写一个程序,创建多个线程,每个线程都对一个全局变量进行加1操作,并输出结果。

要求保证线程安全,不出现资源竞争问题。

6. 线程优先级编写一个程序,创建两个线程,一个线程的优先级设置为较高,另一个线程的优先级设置为较低。

让两个线程分别输出"High Priority"和"Low Priority",并观察输出结果。

7. 线程中断编写一个程序,创建一个线程,让它循环输出数字,直到接收到中断信号。

当接收到中断信号后,线程应该停止输出,并输出"Thread interrupted!"。

8. 线程超时编写一个程序,创建一个线程,让它在指定时间内输出"Hello, World!",超过指定时间后线程应该停止输出,并输出"Timeout!"。

以上是一些多线程练习题,通过完成这些练习,可以提高自己的多线程编程能力。

Android——多线程编程练习题

Android——多线程编程练习题

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个线程设计问题

多线程面试题c++ 4个线程设计问题

多线程面试题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实现线程有哪⼏种⽅式?1、继承Thread类实现多线程2、实现Runnable接⼝⽅式实现多线程3、使⽤ExecutorService、Callable、Future实现有返回结果的多线程多线程同步有哪⼏种⽅法?Synchronized关键字,Lock锁实现,分布式锁等。

Runnable和Thread⽤哪个好?Java不⽀持类的多重继承,但允许你实现多个接⼝。

所以如果你要继承其他类,也为了减少类之间的耦合性,Runnable会更好。

Java中notify和notifyAll有什么区别?notify()⽅法不能唤醒某个具体的线程,所以只有⼀个线程在等待的时候它才有⽤武之地。

⽽notifyAll()唤醒所有线程并允许他们争夺锁确保了⾄少有⼀个线程能继续运⾏。

为什么wait/notify/notifyAll这些⽅法不在thread类⾥⾯?这是个设计相关的问题,它考察的是⾯试者对现有系统和⼀些普遍存在但看起来不合理的事物的看法。

回答这些问题的时候,你要说明为什么把这些⽅法放在Object类⾥是有意义的,还有不把它放在Thread类⾥的原因。

⼀个很明显的原因是JAVA提供的锁是对象级的⽽不是线程级的,每个对象都有锁,通过线程获得。

如果线程需要等待某些锁那么调⽤对象中的wait()⽅法就有意义了。

如果wait()⽅法定义在Thread类中,线程正在等待的是哪个锁就不明显了。

简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。

为什么wait和notify⽅法要在同步块中调⽤?主要是因为Java API强制要求这样做,如果你不这么做,你的代码会抛出IllegalMonitorStateException异常。

还有⼀个原因是为了避免wait 和notify之间产⽣竞态条件。

什么是死锁?如何避免死锁?死锁就是两个线程相互等待对⽅释放对象锁。

多线程试卷参考答案

多线程试卷参考答案

考试参考答案一、单项选择题(从下列各题四个备选答案中选出一个正确答案,并将其代号写在答题纸相应位置处。

答案错选或未选者,该题不得分。

)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多线程试题_答案

java多线程试题_答案

java多线程试题_答案多线程一.选择题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() 。

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

java中有几种方法可以实现一个线程(jdk5.0之前)?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?答:有两种实现方法,分别是继承Thread类与实现Runnable接口。

用synchronized关键字修饰同步方法,反对使用stop(),是因为它不安全。

它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。

结果很难检查出真正的问题所在。

suspend()方法容易发生死锁。

调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。

此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。

对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。

所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。

若标志指出线程应该挂起,便用wait()命其进入等待状态。

若标志指出线程应当恢复,则用一个notify()重新启动线程。

sl eep() 和wait() 有什么区别?答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。

调用sleep不会释放对象锁。

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

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

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

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

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

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

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

run()方法就是正常的对象调用方法的执行,并不是使用分线程来执行的。

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?答:不能,一个对象的一个synchronized方法只能由一个线程访问。

请说出你所知道的线程同步的方法。

答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。

sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口同步的实现方面有两种,分别是synchronized,wait与notify线程的基本概念、线程的基本状态以及状态之间的关系答:线程指在程序执行过程中,能够执行程序代码的一个执行单位,每个程序至少都有一个线程,也就是程序本身。

Java中的线程有四种状态分别是:创建、就绪、运行、阻塞、结束简述synchronized和java.util.concurrent.locks.Lock的异同?答:主要相同点:Lock能完成synchronized所实现的所有功能主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。

synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally 从句中释放。

案例:三个线程间的通讯public class Demo01 {public static void main(String[] args) {//三个线程间的通讯MyTask task = new MyTask();new Thread(){public void run() {while(true){try {task.task1();} catch (InterruptedException e1) {e1.printStackTrace();}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}};}.start();new Thread(){public void run() {while(true){try {task.task2();} catch (InterruptedException e1) {e1.printStackTrace();}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}};}.start();new Thread(){public void run() {while(true){try {task.task3();} catch (InterruptedException e1) {e1.printStackTrace();}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}};}.start();}}class MyTask{//标识 1:可以执行任务1,2:可以执行任务2, 3:可以执行任务3int flag = 1;public synchronized void task1() throws InterruptedException{ if(flag != 1){this.wait();//当前线程等待//this.wait(timeout);}System.out.println("1.银行信用卡自动还款任务...");flag = 2;//this.notify();//唤醒随机线程this.notifyAll();//唤醒所有等待线程}public synchronized void task2() throws InterruptedException{if(flag != 2){this.wait();//线程等待}System.out.println("2.银行储蓄卡自动结算利息任务...");flag = 3;//this.notify();//唤醒其它线程this.notifyAll();}public synchronized void task3() throws InterruptedException{ if(flag != 3){this.wait();//线程等待}System.out.println("3.银行短信提醒任务...");flag = 1;//this.notify();//唤醒其它线程this.notifyAll();}}一、判断题1.C 和Java 都是多线程语言。

()2.如果线程死亡,它便不能运行。

()3.在Java 中,高优先级的可运行线程会抢占低优先级线程。

()4.程序开发者必须创建一个线程去管理内存的分配。

()5.一个线程在调用它的start 方法,之前,该线程将一直处于出生期。

()6.当调用一个正在进行线程的stop()方法时,该线程便会进入休眠状态。

()7.如果线程的run 方法执行结束或抛出一个不能捕获的例外,线程便进入等待状态。

()8.一个线程可以调用yield 方法使其他线程有机会运行。

()【答案】1.难度:容易答案:错误知识点:C 是单线程语言。

2.难度:容易答案:正确知识点:线程死亡就意味着它不能运行。

3.难度:适中答案:正确知识点:线程优先级的使用。

4.难度:适中答案:错误知识点:Java 提供了一个系统线程来管理内存的分配。

5.难度:容易答案:正确知识点:出生期的概念。

6.难度:适中答案:错误知识点:应该是sleep 方法。

7.难度:适中答案:错误知识点:如果线程的run 方法执行结束或抛出一个不能捕获的例外,线程便进入死亡状态。

8.难度:适中答案:正确知识点:yield 方法总是让高优先级的就绪线程先运行。

二、选择题1.Java 语言中提供了一个▁▁线程,自动回收动态分配的内存。

A 异步B 消费者C 守护D 垃圾收集2.当▁▁方法终止时,能使线程进入死亡状态。

A runB setProrityC yieldD sleep3.用▁▁方法可以改变线程的优先级。

A runB setProrityC yield4.线程通过▁▁方法可以使具有相同优先级线程获得处理器。

A runB setProrityC yieldD sleep5.线程通过▁▁方法可以休眠一段时间,然后恢复运行。

A runB setProrityC yieldD sleep6.▁▁方法使对象等待队列的第一个线程进入就绪状态。

A runB notifyC yieldD sleep7.方法resume( )负责重新开始▁▁线程的执行。

A 被stop( )方法停止B 被sleep( )方法停止C 被wait( )方法停止D 被suspend( )方法停止8.▁▁方法可以用来暂时停止当前线程的运行。

A stop( )B sleep( )C wait( )D suspend()【答案】1.难度:容易知识点:垃圾线程的使用。

2.难度:容易答案:A知识点:run 方法的使用。

3.难度:容易答案:B知识点:setPrority 方法的使用。

4.难度:容易答案:C知识点:yield 方法的使用。

5.难度:容易答案:D知识点:sleep 方法的使用。

6.难度:容易答案:B知识点:notify 方法的使用。

7.难度:适中答案:D知识点:一个线程被用suspend( )方法,将该线程挂起。

并通过调用resume( )方法来重新开始线程的执行。

但是该方法容易导致死锁,应尽量避免使用。

8.难度:适中答案:BCD知识点:当调用stop( )方法后,当前的线程不能重新开始运行。

相关文档
最新文档