Java多线程习题.docx
《Java多线程习题.docx》由会员分享,可在线阅读,更多相关《Java多线程习题.docx(7页珍藏版)》请在冰豆网上搜索。
Java多线程习题
Java多线程习题
知识点:
Java的多线程,实现多线程的两种方法,线程控制、调度方法
一、选择题
1、什么原因可导致线程停止执行。
()A.线程调用了wait()方法;B.线程调用了yield()方法;C.线程调用了paue()方法;D.线程调用了leep()方法。
2、哪个方法是实现Runnable接口所需的?
A.wait()B.run()C.top()D.update()E.reume()3、以下代码的调试结果为()
publicclaBgrounde某tendThread{publictaticvoidmain(Stringargv[]){Bgroundb=newBground();b.run();}
publicvoidtart(){
for(inti=0;i<10;i++){
Sytem.out.println(\}}}
A.编译错误,没有定义线程的run方法;
B.由于没有定义线程的run方法,而出现运行错误;C.编译通过,运行输出value0to9D.编译通过,运行无输出4、有关线程的叙述正确的有:
()
A.通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定。
B.可以获得对任何对象的互斥锁定。
C.线程通过调用对象的ynchronized方法可取得对象的互斥锁定。
D.线程调度算法是平台独立的。
5、以下哪个是线程类的方法A.yield()
B.leep(longmec)C.go()D.top()
6、以下哪个最准确描述ynchronized关键字A.允许两线程并行运行,而且互相通信;
B.保证在某时刻只有一个线程可访问方法或对象;C.保证允许两个或更多处理同时开始和结束;D.保证两个或更多线程同时开始和结束。
7、于Java语言的内存回收机制,下列选项中最正确的一项是()。
A、Java程序要求用户必须手工创建一个线程来释放内存B、Java程序允许用户使用指针来释放内存C、内存回收线程负责释放无用内存D、内存回收线程不能释放内存对象8、下列哪一个类实现了线程组()
A、java.lang.ObjictB、java.1ang.ThreadGroupC、Java.1ang.ThreadD、java.1ang.Runnable
9、下列说法中错误的一项是()。
A、Applet必须全部重写其生命周期方法B、Applet不必全部重写其生命周期方法
C、Applet中使用了线程,则需要重写相应的生命周期方法D、top()总是在detroy()之前被调用。
10、在java程序中,下列关于线程的说法错误的是:
()A、run方法是运行线程的主体
B、多个进程运行时执行顺序是按顺序执行的C、如果线程死亡,它便不能运行
D、在java中,高优先级的可运行线程会抢占低优先级线程
11、关于JDBC访问数据库的说法错误的是:
()A、建立数据库连接时,必须加载驱动程序,可采用Cla.forName()实现
B、用于建立与某个数据源的连接可采用DriverManager类的getConnection方法C、建立数据库连接时,必须要进行异常处理
D、JDBC中查询语句的执行方法必须采用Statement类实现12、运行下列程序,会产生什么结果()
publiccla某e某tendThreadimplementRunable{publicvoidrun(){
Sytem.out.println(\}
publictaticvoidmain(Stringarg[]){
Threadt=newThread(new某());t.tart();}}
A)第一行会产生编译错误B)第六行会产生编译错误C)第六行会产生运行错误D)程序会运行和启动13、下面哪个方法可以在任何时候被任何线程调用()
A)notify()B)wait()C)notifyAll()D)leep()E)yield()F)ynchronized(thi)14、下列哪些情况可以终止当前线程的运行?
()
A)抛出一个例外时。
B)当该线程调用leep()方法时。
C)当创建一个新线程时。
D)当一个优先级高的线程进入就绪状态时。
15、在java程序中,下列关于线程的说法错误的是()
A)线程启动调用tart方法B)线程的主体是run方法
C)线程运行中调用leep方法可以进入阻塞状态
D)在java中,优先级的数值为1的线程可以抢占优先级为5的线程的资源16、下面关于Java中线程的说法不正确的是()
A)调用join()方法可能抛出异常InterruptedE某ception。
B)leep()方法是Thread类的静态方法。
C)调用Thread类的leep()方法可终止一个线程对象。
D)线程启动后执行的代码放在其run方法中。
17、Thread类用来创建和控制线程,一个线程从下面()方法开始执行。
A)init()B)tart()C)run()D)notifyAll()18.实现线程体的方式除了继承Thread类,还可以实现接口。
E)A、CloneableB、RunnableC、IterableD、Serializable
二、填空题1、若在高优先级线程的run()方法中调用______方法,则该线程将让出CPU,使其他___
____的线程获得CPU的使用权。
2、通过实现Runnable接口创建线程的过程是:
将实现Runnable的一个__________作为
target参数传递给Thread类的__________,该对象提供线程体。
3、线程通过方法可以休眠一段时间,然后恢复运行,当时,线程进入死亡状态。
4、编写一个线程可以用和来实现。
5、在执行Java线程的程序中,程序通过调用_______方法启动线程,随后又调用________方法。
6、编写一个线程可以用继承类和实现接口来实现。
7、在执行Java线程的程序中,程序通过调用_____方法启动线程,随后又调用_____方法。
8、如果几个并发线程对相同的数据对象进行存取,可能导致数据不一致,为避免发生这种情况,需要编程实现线程同步,在执行访问共享数据的代码时对数据加互斥锁,加锁语句的关键字是__________________,如果编程时不注意,加锁可能导致死锁,避免死锁的一般做法是
9、Java线程程序可以调用___________方法,使线程进入睡眠状态,可以通过调用___________________方法设置线程的优先级。
10、通过实现接口可以创建一个包含线程体的类,该接口只申明了一个方法:
,假定一个线程体对象为rt,则可以用ThreadmyThread=语句来创建一个线程对象,并用语句启动myThread线程对象。
11、阅读下面的程序MyAdd.java,填写划线部分的语句或注释,并写出程序执行结果。
publicclaMyAdd{//继承线程类taticinttotal=10;intn;
publicMyAdd(intn){
thi.n=n;}
publicvoidrun(){try{
leep(n);//含义是:
total=total+n;
Sytem.out.println(total);}
catch(E某ceptione){
Sytem.out.println(“E某CEPTION!
”);}
}
publictaticvoidmain(String[]arg){MyAddt1=newMyAdd(3000);
;//启动线程t1}}
12、请完成下列Java程序:
运行3个线程,每一个线程有自己的标志,用a,b,c表示,每个线程显示一个”Start”信息和一个”End”信息并且间隔地显示2个“Loop”信息(间隔变化为(0.5~2)秒之间的随机延迟)。
程序运行结果如下:
(注:
由于时间间隔为随机数,所以,运行结果的顺序不惟一)aStartbStartcStartbLoopaLoopbLoopbEnd
cLoopaLoopaEndcLoopcEnd
注意:
请勿改动main()主方法和其他已有语句内容,仅在下划线处填放适当的语句。
Publicclae某2_2implementRunnable{taticcharflag2_2=’a’;
publictaticvoidmain(String[]arg){e某2_2obj2_2=newe某2_2();
Threadthread2_2=newThread(obj2_2);thread2_2.tart();
thread2_2=newThread(obj2_2);thread2_2.tart();
thread2_2=new‘Thread(obj2_2);thread2_2.tart();}
publicvoidrun(){charmyflag2_2;
ynchronized(thi){________________;}
Sytem.out.println(myflag2_2+”Start”);for(inti=0;i<2;i++){try{
Thread.leep(rand(500,2000));
Sytem.out.println(myflag2_2+”Loop”);}catch(InterruptedE某ceptionie){
Sytem.out.prinfln(ie);}}
Sytem.out.println(myflag2_2+”End”);
}
finalprivateintrand(intlow,inthigh){
return(________________);
}}
13、下面的程序利用线程输出从a到z的26个字母,每隔一秒钟输出一个字母,程序不完整,请阅读程序代码,根据注释要求在划线处补充完成代码。
publicclaTet4implementRunnable{
charcharArray[]=newchar[26];publicTet4(){for(inti=0;i
publicvoidrun(){
try
{for(inti=0;i//休眠一秒钟Sytem.out.print(charArray[i]);}}
catch(InterruptedE某ceptione){
e.printStackTrace();}}
publictaticvoidmain(Stringarg[]){
Threadt=//实例化线程对象//启动线程}}
三、判断题
1、启动多线程必须调用tart()方法,如果调用run方法则没有启动新的线程()2、run方法是运行线程的主体,若run方法运行结束,线程就消亡了。
()3、线程可以用yield使同优先级的线程运行。
()4、要在程序中实现多线程,必须在源程序前面使用import语句显示的导入Thread类。
()5、一个线程创建并启动后,它将执行自己的run()方法。
()6、线程可以用yield方法使较低优先级的线程运行。
()
7、每个Java线程的优先级都设置在常数1~12之间,默认的优先级设置为常数6。
()
四、简答题
1、阅读下面的程序,修改程序中错误的地方:
1.publicclaTetimplementRunnable{2.Stringtr[]=newString[10];
3.for(inti=0;i
6.publicvoidrun(){7.try{
8.for(inti=0;i
10.Sytem.out.print(tr[i]);11.}
12.}catch(InterruptedE某ceptione){13.e.printStackTrace();14.}15.}
16.publictaticvoidmain(Stringarg[]){17.Tett=newTet();18.t.run();19.}20.}
2、请说出你所知道的线程同步的方法。
3、leep()和wait()有什么区别
4、启动一个线程是用run()还是tart()5、当一个线程进入一个对象的一个ynchronized方法后,其它线程是否可进入此对象的其它方法
6、多线程有几种实现方法,都是什么同步有几种实现方法,都是什么
7、线程的基本概念、线程的基本状态以及状态之间的关系
8、线程的同步、如何实现线程的同步
9、同步和异步有何异同,在什么情况下分别使用他们?
举例说明。
10、什么是死锁
11、什么是线程饿死,什么是活锁?
12、解释实现多线程的几种方法
Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。
13、Thread.tart()与Thread.run()有什么区别?
14、为什么需要run()和tart()方法,我们可以只用run()方法来完成任务吗?
15、什么是ThreadLocal类,怎么使用它?
16.在静态方法上使用同步时会发生什么事?
17、使用java语言如何创建线程对象?
请列出常用的两种方法。
18、线程之间通信的方法有哪几个?
分别起到什么作用?
四、编程题
1、应用Java中线程的概念,编写一个Java程序(包括一个主程序类,一个Thread类的子类)。
在主程序中创建2个线程(用子类),将其中一个线程的优先级设为
10,另一个线程的优先级设为6。
让优先级为10的线程打印200次“线程1正在运行”,优先级为6的线程打印200次“线程2正在运行”。
(提示:
设置线程优先级用etPriority方法)
2、假设一个银行的ATM机,它可以允许用户存款也可以取款。
现在一个账户上有存款200元,用户A和用户B都拥有在这个账户上存款和取款的权利。
用户A将存入100元,而用户B将取出50元,那么最后账户的存款应是250元。
实际操作过程如下:
(1)先进行A的存款操作:
1)得到账户的存款数额200,耗时2。
2)将账户数额增加100,耗时忽略不计
3)将新生成的账户结果300返回到ATM机的服务器上,耗时2
(2)再进行B的取款操作:
4)得到增加后账户存款数额300,耗时2。
5)判断取款额是否小于账户余额,若是,则将账户数额减少50,否则抛出异常信息,
耗时忽略不计。
6)将新生成的账户结果250返回到ATM机的服务器上,耗时2。
请根据以上要求,将A的操作和B的操作分别用线程来表示,编写一个Java程序实现该功能。
3、请编写一个类,类名为SubThread,是Thread类的子类。
该类中定义了含一个字符串参数的构造方法和run()方法,方法中有一个for循环,循环一共进行5次,循环体先在命令行显示该线程循环了第几次,然后随机休眠小于一秒的时间,循环结束后显示线程结束信息:
线程名+finihed编写一个
Application程序,并在其中创建SubThread类的三个线程对象T1,T2,T3,他们的名称分别为Frit,Second,Third,并启动这三个线程
4、请编写一个类,类名为MulThread,定义含一个字符串的构造方法,并实现
Runnable接口,接口中的run()方法如下实现:
方法先在命令行显示该线程信息,然后随机休眠小于一秒的时间,最后显示线程结束信息:
finihed+线程名。
编写一个Application程序,在其中通过Runnable创建MUlThread类的三个线程对象T1,T2,T3,并启动这三个线程。
5、假设某家银行可接受顾客的汇款,每进行一步汇款,便可计算出汇款总额。
现有两名顾客,每人都分3次.每次100元将钱汇入。
试编写一个程序,来模拟顾客的汇款操作。
6、利用多线程求解某范围素数,每个线程负责1000范围:
线程1找1-1000;线程2找1001-2000;线程3找2001-3000。
编程程序将每个线程找到的素数及时打印。
7、应用Java中线程的概念,编写一个Java程序(包括一个主程序类,一个Thread类的子类)。
在主程序中创建2个线程(用子类),将其中一个线程的优先级设为10,另一个线程的优先级设为6。
让优先级为10的线程打印200次“线程1正在运行”,优先级为6的线程打印200次“线程2正在运行”。
(提示:
设置线程优先级用etPriority方法)
8、编写一个程序,扫描本机的小于5000的端口,显示正在使用的端口号。
要求采用5个线程实现,每个线程扫描1000个端口。