经典多线程的练习题.docx

上传人:b****0 文档编号:16936693 上传时间:2023-07-19 格式:DOCX 页数:17 大小:23.22KB
下载 相关 举报
经典多线程的练习题.docx_第1页
第1页 / 共17页
经典多线程的练习题.docx_第2页
第2页 / 共17页
经典多线程的练习题.docx_第3页
第3页 / 共17页
经典多线程的练习题.docx_第4页
第4页 / 共17页
经典多线程的练习题.docx_第5页
第5页 / 共17页
经典多线程的练习题.docx_第6页
第6页 / 共17页
经典多线程的练习题.docx_第7页
第7页 / 共17页
经典多线程的练习题.docx_第8页
第8页 / 共17页
经典多线程的练习题.docx_第9页
第9页 / 共17页
经典多线程的练习题.docx_第10页
第10页 / 共17页
经典多线程的练习题.docx_第11页
第11页 / 共17页
经典多线程的练习题.docx_第12页
第12页 / 共17页
经典多线程的练习题.docx_第13页
第13页 / 共17页
经典多线程的练习题.docx_第14页
第14页 / 共17页
经典多线程的练习题.docx_第15页
第15页 / 共17页
经典多线程的练习题.docx_第16页
第16页 / 共17页
经典多线程的练习题.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

经典多线程的练习题.docx

《经典多线程的练习题.docx》由会员分享,可在线阅读,更多相关《经典多线程的练习题.docx(17页珍藏版)》请在冰点文库上搜索。

经典多线程的练习题.docx

经典多线程的练习题

java中有几种方法可以实现一个线程(jdk5.0之前)?

用什么关键字修饰同步方法?

stop()和suspend()方法为何不推荐使用?

答:

有两种实现方法,分别是继承Thread类与实现Runnable接口。

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

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

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

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

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

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

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

所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,

指出线程应该活动还是挂起。

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

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

sleep()和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从句中释放。

案例:

三个线程间的通讯

publicclassDemo01{

publicstaticvoidmain(String[]args){

//三个线程间的通讯

MyTasktask=newMyTask();

newThread(){

publicvoidrun(){

while(true){

try{

task.task1();

}catch(InterruptedExceptione1){

e1.printStackTrace();

}

try{

Thread.sleep(10);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

};

}.start();

newThread(){

publicvoidrun(){

while(true){

try{

task.task2();

}catch(InterruptedExceptione1){

e1.printStackTrace();

}

try{

Thread.sleep(10);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

};

}.start();

newThread(){

publicvoidrun(){

while(true){

try{

task.task3();

}catch(InterruptedExceptione1){

e1.printStackTrace();

}

try{

Thread.sleep(10);

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

};

}.start();

}

}

classMyTask{

//标识1:

可以执行任务1,2:

可以执行任务2,3:

可以执行任务3

intflag=1;

publicsynchronizedvoidtask1()throwsInterruptedException{

if(flag!

=1){

this.wait();//当前线程等待

//this.wait(timeout);

}

System.out.println("1.银行信用卡自动还款任务...");

flag=2;

//this.notify();//唤醒随机线程

this.notifyAll();//唤醒所有等待线程

}

publicsynchronizedvoidtask2()throwsInterruptedException{

if(flag!

=2){

this.wait();//线程等待

}

System.out.println("2.银行储蓄卡自动结算利息任务...");

flag=3;

//this.notify();//唤醒其它线程

this.notifyAll();

}

publicsynchronizedvoidtask3()throwsInterruptedException{

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.当▁▁方法终止时,能使线程进入死亡状态。

Arun

BsetPrority

Cyield

Dsleep

3.用▁▁方法可以改变线程的优先级。

Arun

BsetPrority

Cyield

Dsleep

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

Arun

BsetPrority

Cyield

Dsleep

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

Arun

BsetPrority

Cyield

Dsleep

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

Arun

Bnotify

Cyield

Dsleep

7.方法resume()负责重新开始▁▁线程的执行。

A被stop()方法停止

B被sleep()方法停止

C被wait()方法停止

D被suspend()方法停止

8.▁▁方法可以用来暂时停止当前线程的运行。

Astop()

Bsleep()

Cwait()

Dsuspend()

【答案】

1.难度:

容易

答案:

D

知识点:

垃圾线程的使用。

2.难度:

容易

答案:

A

知识点:

run方法的使用。

3.难度:

容易

答案:

B

知识点:

setPrority方法的使用。

4.难度:

容易

答案:

C

知识点:

yield方法的使用。

5.难度:

容易

答案:

D

知识点:

sleep方法的使用。

6.难度:

容易

答案:

B

知识点:

notify方法的使用。

7.难度:

适中

答案:

D

知识点:

一个线程被用suspend()方法,将该线程挂起。

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

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

8.难度:

适中

答案:

BCD

知识点:

当调用stop()方法后,当前的线程不能重新开始运行。

 

Java为什么要引入线程机制,线程、程序、进程之间的关系是怎样的。

答:

线程可以彼此独立的执行,它是一种实现并发机制的有效手段,可以同时使用多个线程来完成不同的任务,并且一般用户在使用多线程时并不考虑底层处理的细节。

程序是一段静态的代码,是软件执行的蓝本。

进程是程序的一次动态执行过程,即是处于运行过程中的程序。

线程是比进程更小的程序执行单位,一个进程可以启动多个线程同时运行,不同线程之间可以共享相同的内存区域和数据。

多线程程序是运行时间后嗣可能出现在一个进程之内的、有一个以上线程同时运行的情况的程序。

Runnable接口包括哪些抽象方法?

Thread类有哪些主要域和方法?

答:

Runnable接口中仅有run()抽象方法。

Thread类主要域有:

MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY。

主要方法有start(),run(),sleep(),currentThread(),setPriority(),getPriority(),join()等。

 

创建线程有哪两种方式(jdk5.0之前)?

试写出每种的具体的流程。

比较两种创建方式的不同,哪个更优。

1—继承Thread类

1)定义类继承Thread类。

2)覆盖Thread类中的run方法。

3)创建Thread子类对象,即创建了线程对象。

4)调用线程对象start方法:

启动线程,调用run方法。

2—实现Runnable接口

1)定义类,实现Runnable接口。

2)覆盖Runnable接口中的run方法。

3)通过Thread类建立线程对象。

4)将Runnable接口的子类对象作为实际参数传递给Thread类的构造方法中。

5)调用Thread类的start方法:

开启线程,调用Runnable子类接口的run方法。

【区别】

继承Thread:

线程代码存放Thread子类run方法中。

实现Runnable:

线程代码存在接口的子类的run方法。

【实现方法的好处】

1)避免了单继承的局限性

2)多个线程可以共享同一个接口子类的对象,非常适合多个相同线程来处理同一份资源。

创建多线程题目

编写一个继承Thread类的方式实现多线程的程序。

该类MyThread有两个属性,一个字符串WhoAmI代表线程名,一个整数delay代表该线程随机要休眠的时间。

构造有参的构造器,线程执行时,显示线程名和要休眠时间。

另外,定义一个测试类TestThread,创建三个线程对象以展示执行情况。

classMyThreadextendsThread{

privateStringwhoAmI;

privateintdelay;

publicMyThread(Strings,intd){

whoAmI=s;

delay=d;

}

publicvoidrun(){

try{

sleep(delay);

}catch(InterruptedExceptionie){

}

System.out.println("Hello!

Iam"+whoAmI+",Islept"+delay+"milliseconds");

}

}

publicclassTestThread{

publicstaticvoidmain(String[]args){

MyThreadt1=newMyThread("Thread-1",(int)(Math.random()*100));

MyThreadt2=newMyThread("Thread-2",(int)(Math.random()*100));

MyThreadt3=newMyThread("Thread-3",(int)(Math.random()*100));

t1.start();

t2.start();

t3.start();

}

}

在{1}添加什么代码,可以保证如下代码输出100

提示:

t.wait()或t.jion()或t.yield()或t.interrupt()?

publicclassTest{

publicstaticvoidmain(String[]args){

MyThreadm=newMyThread();

Threadt=newThread(m);

t.start();

{1}

intj=m.i;

System.out.println(j);

}

}

classMyThreadimplementsRunnable{

inti;

publicvoidrun(){

try{

Thread.sleep(1000);

}catch(InterruptedExceptione){

e.printStackTrace();

}

i=100;

}

}

答案:

t.join()

----------------------------------------------------------------------------

利用多线程设计一个程序,同时输出50以内的奇数和偶数,以及当前运行的线程名。

publicclassThreadPrintextendsThread{

intk=1;

publicvoidrun(){

inti=k;

while(i<50){

System.out.println(Thread.currentThread().getName()+"-----"+i);

i+=2;

}

System.out.println(Thread.currentThread().getName()+"end!

");

}

publicstaticvoidmain(String[]args){

ThreadPrintt1=newThreadPrint();

ThreadPrintt2=newThreadPrint();

t1.k=1;

t2.k=2;

t1.start();

t2.start();

}

}

 

建立线程有几种方法?

定义两个线程(一个用继承Thread类,一个用实现Runnable接口),定义一个测试类包括一个主函数调用两个子线程(具体实现自定)

模拟一个人生产50个玩具,每200毫秒生产一个,当生产到第20个时加入每秒吃1个馒头,共吃完3个后在接着生产的多线程。

编写龟兔赛跑多线程程序,设赛跑长度为100米,每跑完10米输出一次结果。

改进上题的龟兔赛跑程序,通过改变优先级,并减掉休眠时间,使得乌龟以迅雷不及掩耳的速度跑完100米。

在多线程中,为什么要引入同步机制?

启动两个线程对一个数字i操作

1)其中1个线程每次对i加1

2)另1个线程每次对i减1

各运行20次,结果i的值等于初始值。

wait()、notify()、notifyAll()的作用分别是什么?

实现一个由A、B、C三个窗口同时销售100张票的系统,要求打印出每个窗口打印的售票情况,并且每个窗口不得连续售票。

模拟3个人排除买票,每人买1张票。

售货员只有1张五元的钱,电影票5元一张,王大拿拿一张二十元的人民币排在谢大脚前面买票,谢大脚拿1张十元的人民币排在在赵四的前面买票,赵四拿1张五元的人民币排在最后。

即最终的卖票次序是:

谢大脚、赵四、王大拿

编写生产者消费者多线程程序,设有一个最大库存量为4的电视机仓库,生产10台电视机,一边生产一边销售(消费)。

多线程操作(50分)

1)启动两个线程对一个数字i操作(10分)

2)其中1个线程每次对i加1(10分)

3)另1个线程每次对i减一(10分)

4)各运行20次,结果i的值等于初始值。

(20分)

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2