Java多线程习题
知识点:
Java的多线程,实现多线程的两种方法,线程控制、调度方法
一、选择题
1、什么原因可导致线程停止执行。( )
A.线程调用了 wait()方法;
B.线程调用了yield()方法;
C.线程调用了 pause()方法;
D.线程调用了 sleep() 方法。
2、哪个方法是实现Runnable接口所需的?
A.wait() B.run() C.stop() 3、以下代码的调试结果为?( )
public class Bground extends Thread{
D.update() E.resume()
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 9
D. 编译通过,运行无输出
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语言的内存回收机制,下列选项中最正确的一项是( )。
A、Java程序要求用户必须手工创建一个线程来释放内存
B、Java程序允许用户使用指针来释放内存
C、内存回收线程负责释放无用内存
D、内存回收线程不能释放内存对象
8、下列哪一个类实现了线程组?( )
A、java.lang.Objict B、java.1ang.ThreadGroup
C、Java.1ang.Thread D、java.1ang.Runnable
9、下列说法中错误的一项是( )。
A、Applet必须全部重写其生命周期方法
B、Applet不必全部重写其生命周期方法
C、Applet中使用了线程,则需要重写相应的生命周期方法
D、stop( )总是在destroy( )之前被调用。
10、在java程序中,下列关于线程的说法错误的是: ( )
A、run方法是运行线程的主体
B、多个进程运行时执行顺序是按顺序执行的
C、如果线程死亡,它便不能运行
D、在java中,高优先级的可运行线程会抢占低优先级线程
11、关于JDBC访问数据库的说法错误的是: ( )
A、建立数据库连接时,必须加载驱动程序,可采用Class.forName()实现
B、 用于建立与某个数据源的连接可采用DriverManager类的getConnection方法
C、建立数据库连接时,必须要进行异常处理
D、JDBC中查询语句的执行方法必须采用Statement类实现
12、运行下列程序, 会产生什么结果 ( )
public class X extends Thread implements Runable{
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) 程序会运行和启动
13、下面哪个方法可以在任何时候被任何线程调用? ( )
A) notify() B) wait()
C) notifyAll() D) sleep()
E) yield() F) synchronized(this)
14、下列哪些情况可以终止当前线程的运行? ( )
A) 抛出一个例外时。 B) 当该线程调用sleep()方法时。
C) 当创建一个新线程时。 D) 当一个优先级高的线程进入就绪状态时。
15、在java程序中,下列关于线程的说法错误的是( )
A) 线程启动调用start方法
B) 线程的主体是run方法
C) 线程运行中调用sleep方法可以进入阻塞状态
D) 在java中,优先级的数值为1的线程可以抢占优先级为5的线程的资源
16、下面关于Java中线程的说法不正确的是( )?
A)调用join()方法可能抛出异常InterruptedException。
B)sleep()方法是Thread类的静态方法。
C)调用Thread类的sleep()方法可终止一个线程对象。
D)线程启动后执行的代码放在其run方法中。
17、Thread类用来创建和控制线程,一个线程从下面( )方法开始执行。
A) init() B) start() C) run() D) notifyAll()
18.实现线程体的方式除了继承Thread类,还可以实现 接口。
E) A、Cloneable B、Runnable C、Iterable D、Serializable
二、填空题
1、若在高优先级线程的run( )方法中调用___ ___方法,则该线程将让出CPU,使其他___ ____的线程获得CPU的使用权。
2、通过实现Runnable接口创建线程的过程是:将实现Runnable的一个___ _______作为target参数传递给Thread类的____ ______,该对象提供线程体。
3、线程通过 方法可以休眠一段时间,然后恢复运行,当 时,线程进入死亡状态。
4、编写一个线程可以用 和 来实现。
5、在执行Java线程的程序中,程序通过调用_______方法启动线程,随后又调用________方法。
6、编写一个线程可以用继承 类和实现 接口来实现。
7、在执行Java线程的程序中,程序通过调用____ _方法启动线程,随后又调用_____方法。
8、如果几个并发线程对相同的数据对象进行存取,可能导致数据不一致,为避免发生这种情况,需要编程实现线程同步,在执行访问共享数据的代码时对数据加互斥锁,加锁语句的关键字是_______ ___________,如果编程时不注意,加锁可能导致死锁,避免死锁的一般做法是 。
9、Java线程程序可以调用___________方法,使线程进入睡眠状态,可以通过调用__ _________________方法设置线程的优先级。
10、通过实现接口 可以创建一个包含线程体的类,该接口只申明了一个方法: ,假定一个线程体对象为rt,则可以用Thread myThread = 语句来创建一个线程对象,并用语句 启动myThread线程对象。
11、阅读下面的程序MyAdd.java,填写划线部分的语句或注释,并写出程序执行结果。
public class MyAdd { //继承线程类
static int total = 10;
int n;
public MyAdd(int n){
this.n=n;
}
public void run() {
try{
sleep(n); //含义是: total=total+n;
System.out.println(total);
}
catch(Exception e){
System.out.println(“EXCEPTION!”);
}
}
public static void main(String[] args) {
MyAdd t1 = new MyAdd(3000);
; //启动线程t1
}
}
12、请完成下列Java程序:运行3个线程,每一个线程有自己的标志,用a,b,c表示,每个线程显示一个”Start”信息和一个”End”信息并且间隔地显示2个“Loop”信息(间隔变化为(0.5~2)秒之间的随机延迟)。
程序运行结果如下:(注:由于时间间隔为随机数,所以,运行结果的顺序不惟一)
a Start
b Start
c Start
b Loop
a Loop
b Loop
b End
c Loop
a Loop
a End
c Loop
c End
注意:请勿改动main()主方法和其他已有语句内容,仅在下划线处填放适当的语句。
Public class ex2_2 implements Runnable{
static char flag2_2=’a’;
public static void main(String[ ]arg){
ex2_2 obj2_2=new ex2_2 ( );
Thread thread2_2=new Thread(obj2_2);
thread2_2.start();
thread2_2=new Thread(obj2_2);
thread2_2.start();
thread2_2=new‘Thread(obj2_2);
thread2_2.start();
}
public void run(){
char myflag2_2;
synchronized(this){
________________ ;
}
System.out.println(myflag2_2+”Start”);
for(int i=0;i<2;i++){
try{
Thread.sleep(rand(500,2000));
System.out.println(myflag2_2+”Loop”);
}catch(InterruptedException ie){
System.out.prinfln(ie);
}
}
System.out.println(myflag2_2+”End”);
}
final private int rand(int low,int high){
return(________________);
}
}
13、下面的程序利用线程输出从a到z的26个字母,每隔一秒钟输出一个字母,程序不完整,请阅读程序代码,根据注释要求在划线处补充完成代码。
public class Test4 implements Runnable
{
char charArray[]=new char[26];
public Test4()
{
for(int i = 0; i charArray[i]=(char)(i+'a'); } } public void run() { try { for (int i = 0; i < charArray.length; i++) { //休眠一秒钟 System.out.print(charArray[i]); } } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String args[]) { Thread t = //实例化线程对象 //启动线程 } } 三、判断题 1、启动多线程必须调用start()方法, 如果调用run方法则没有启动新的线程 。(2、run方法是运行线程的主体,若run方法运行结束,线程就消亡了。 ) 3、线程可以用yield使同优先级的线程运行。 ( ) )( 4、要在程序中实现多线程,必须在源程序前面使用import语句显示的导入Thread类。( ) 5、一个线程创建并启动后,它将执行自己的run()方法。 ( ) 6、线程可以用yield方法使较低优先级的线程运行。( ) 7、每个Java线程的优先级都设置在常数1~12之间,默认的优先级设置为常数6。(四、简答题 1、阅读下面的程序,修改程序中错误的地方: 1. public class Test implements Runnable { 2. String str[]=new String[10]; 3. for (int i = 0; i < str.length(); i++) { 4. str[i]=i+”-”; 5. } 6. public void run() { 7. try { ) 8. for (int i = 0; i < str.length(); i++) { 9. sleep(1000); 10. System.out.print(str[i]); 11. } 12. } catch (InterruptedException e) { 13. e.printStackTrace(); 14. } 15. } 16. public static void main(String args[]) { 17. Test t = new Test(); 18. t.run(); 19. } 20. } 2、请说出你所知道的线程同步的方法。 3、 sleep() 和 wait() 有什么区别? 4、启动一个线程是用run()还是start()? 5、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 6、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 7、线程的基本概念、线程的基本状态以及状态之间的关系 8、线程的同步、如何实现线程的同步 9、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 10、什么是死锁 11、什么是线程饿死,什么是活锁? 12、解释实现多线程的几种方法? Java 线程可以实现 Runnable 接口或者继承 Thread 类来实现,当你打算多重继承时,优先选择实现 Runnable。 13、Thread.start ()与 Thread.run ()有什么区别? 14、为什么需要 run ()和 start ()方法,我们可以只用 run ()方法来完成任务吗? 15、什么是 ThreadLocal 类,怎么使用它? 16.在静态方法上使用同步时会发生什么事? 17、使用java语言如何创建线程对象?请列出常用的两种方法。 18、线程之间通信的方法有哪几个?分别起到什么作用? 四、编程题 1、应用Java中线程的概念,编写一个Java程序(包括一个主程序类,一个Thread 类的子类)。在主程序中创建 2个线程(用子类),将其中一个线程的优先级设为 10,另一个线程的优先级设为 6。让优先级为10 的线程打印200次“线程 1正在运行”,优先级为6 的线程打印200次“线程 2正在运行”。(提示:设置线程 优先级用setPriority 方法) 2、假设一个银行的ATM机,它可以允许用户存款也可以取款。现在一个账户上有存款200元,用户A和用户B都拥有在这个账户上存款和取款的权利。用户A将存入100元,而用户B将取出50元,那么最后账户的存款应是250元。实际操作过程如下: (1) 先进行A的存款操作: 1) 得到账户的存款数额200,耗时2s。 2) 将账户数额增加100,耗时忽略不计 3) 将新生成的账户结果300返回到ATM机的服务器上,耗时2s (2) 再进行B的取款操作: 4) 得到增加后账户存款数额300,耗时2s。 5) 判断取款额是否小于账户余额,若是,则将账户数额减少50,否则抛出异常信息,耗时忽略不计。 6) 将新生成的账户结果250返回到ATM机的服务器上,耗时2s。 请根据以上要求,将A的操作和B的操作分别用线程来表示,编写一个Java程序实现该功能。 3、请编写一个类,类名为 Sub Thread, 是 Thread 类的子类。该类中定义了 含一个字符串参数的构造方法和 run()方法,方法中有一个 for循环,循环一共 进行5次,循环体先在命令行显示该线程循环了第几次,然后随机休眠小于一秒 的时间,循环结束后显示线程结束信息:线程名+finished 。 编写一个 Application程序,并在其中创建 Sub Thread 类的三个线程对象T1,T2,T3, 他们的名称分别为Frist,Second,Third,并启动这三个线程 4、请编写一个类,类名为 MulThread,定义含一个字符串的构造方法,并实现 Runnable接口,接口中的 run()方法如下实现:方法先在命令行显示该线程信息, 然后随机休眠小于一秒的时间,最后显示线程结束信息:finished+线程名。编 写一个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正在运行”。(提示:设置线程优先级用setPriority方法) 8、编写一个程序,扫描本机的小于5000的端口,显示正在使用的端口号。要求采用5个线程实现,每个线程扫描1000个端口。 因篇幅问题不能全部显示,请点此查看更多更全内容