1、Java 多线程习题知识点:Java 的多线程,实现多线程的两种方法,线程控制、调度方法 一、选择题1、什么原因可导致线程停止执行。 ( )A线程调用了 wait()方法;B线程调用了 yield()方法;C线程调用了 pause()方法;D线程调用了 sleep() 方法。2、哪个方法是实现 Runnable 接口所需的?Await() Brun() Cstop() Dupdate() Eresume()3、以下代码的调试结果为?( )public class Bground extends Threadpublic static void main(String argv)Bground
2、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. 线程通过调用对象的 synchroni
3、zed 方法可取得对象的互斥锁定。D. 线程调度算法是平台独立的。5、以下哪个是线程类的方法?Ayield()B. sleep(long msec)C. go()D. stop()6、 以下哪个最准确描述 synchronized 关键字?A允许两线程并行运行,而且互相通信;B. 保证在某时刻只有一个线程可访问方法或对象;C. 保证允许两个或更多处理同时开始和结束;D. 保证两个或更多线程同时开始和结束。7、于 Java 语言的内存回收机制,下列选项中最正确的一项是( )。A、Java 程序要求用户必须手工创建一个线程来释放内存B、Java 程序允许用户使用指针来释放内存C、内存回收线程负责释
4、放无用内存D、内存回收线程不能释放内存对象8、下列哪一个类实现了线程组?( )A、java.lang.Objict B、java.1ang.ThreadGroup C、Java.1ang.Thread D、java.1ang.Runnable9、下列说法中错误的一项是( )。A、Applet 必须全部重写其生命周期方法B、Applet 不必全部重写其生命周期方法C、Applet 中使用了线程,则需要重写相应的生命周期方法D、stop( )总是在 destroy( )之前被调用。10、在 java 程序中,下列关于线程的说法错误的是: ( )A、run 方法是运行线程的主体B、多个进程运行时执行
5、顺序是按顺序执行的C、如果线程死亡,它便不能运行D、在 java 中,高优先级的可运行线程会抢占低优先级线程11、关于 JDBC 访问数据库的说法错误的是: ( )A、建立数据库连接时,必须加载驱动程序,可采用 Class.forName()实现B、 用于建立与某个数据源的连接可采用 DriverManager 类的 getConnection 方法C、建立数据库连接时,必须要进行异常处理D、JDBC 中查询语句的执行方法必须采用 Statement 类实现12、运行下列程序, 会产生什么结果 ( )public class X extends Thread implements Runabl
6、e 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、下列
7、哪些情况可以终止当前线程的运行? ( )A) 抛出一个例外时。 B) 当该线程调用 sleep()方法时。 C) 当创建一个新线程时。 D) 当一个优先级高的线程进入就绪状态时。 15、在 java 程序中,下列关于线程的说法错误的是( )A) 线程启动调用 start 方法B) 线程的主体是 run 方法C) 线程运行中调用 sleep 方法可以进入阻塞状态D) 在 java 中,优先级的数值为 1 的线程可以抢占优先级为 5 的线程的资源16、下面关于 Java 中线程的说法不正确的是( )?A)调用 join()方法可能抛出异常 InterruptedException。B)sleep(
8、)方法是 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,使其他_ _的线程获得
9、 CPU 的使用权。2、通过实现 Runnable 接口创建线程的过程是:将实现 Runnable 的一个_ _作为target 参数传递给 Thread 类的_ _,该对象提供线程体。3、线程通过 方法可以休眠一段时间,然后恢复运行,当 时,线程进入死亡状态。4、编写一个线程可以用 和 来实现。5、在执行 Java 线程的程序中,程序通过调用_方法启动线程,随后又调用_方法。6、编写一个线程可以用继承 类和实现 接口来实现。7、在执行 Java 线程的程序中,程序通过调用_ _方法启动线程,随后又调用_方法。8、如果几个并发线程对相同的数据对象进行存取,可能导致数据不一致,为避免发生这种情况
10、,需要编程实现线程同步,在执行访问共享数据的代码时对数据加互斥锁,加锁语句的关键字是_ _,如果编程时不注意,加锁可能导致死锁,避免死锁的一般做法是 。9、Java 线程程序可以调用_方法,使线程进入睡眠状态,可以通过调用_ _方法设置线程的优先级。10、通过实现接口 可以创建一个包含线程体的类,该接口只申明了一个方法: ,假定一个线程体对象为 rt,则可以用 Thread myThread = 语句来创建一个线程对象,并用语句 启动 myThread 线程对象。11、阅读下面的程序 MyAdd.java,填写划线部分的语句或注释,并写出程序执行结果。public class MyAdd /继
11、承线程类static int total = 10; int n;public MyAdd(int n) this.n=n; public void run() trysleep(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 个线程,每一个线程有自
12、己的标志,用 a,b,c 表示,每个线程显示一个”Start”信息和一个”End”信息并且间隔地显示 2 个“Loop”信息(间隔变化为(052)秒之间的随机延迟)。程序运行结果如下:(注:由于时间间隔为随机数,所以,运行结果的顺序不惟一)a Startb Startc Startb Loopa Loopb Loopb Endc Loopa Loopa Endc Loopc End注意:请勿改动 main()主方法和其他已有语句内容,仅在下划线处填放适当的语句。Public class ex2_2 implements Runnablestatic char flag2_2=a;public
13、static void main(String arg)ex2_2 obj2_2=new ex2_2 ( );Thread thread2_2=new Thread(obj2_2);thread2_2start();thread2_2=new Thread(obj2_2);thread2_2start();thread2_2=newThread(obj2_2);thread2_2start();public void run()char myflag2_2;synchronized(this)_ ;Systemoutprintln(myflag2_2+”Start”);for(int i=0;
14、i2;i+)tryThreadsleep(rand(500,2000);Systemoutprintln(myflag2_2+”Loop”);catch(InterruptedException ie)Systemoutprinfln(ie);Systemoutprintln(myflag2_2+”End”);final private int rand(int low,int high)return(_);13、下面的程序利用线程输出从 a 到 z 的 26 个字母,每隔一秒钟输出一个字母,程序不完整,请阅读程序代码,根据注释要求在划线处补充完成代码。public class Test4 i
15、mplements Runnablechar charArray=new char26;public Test4()for(int i = 0; icharArray.length; i+)charArrayi=(char)(i+a); public void run() try for (int i = 0; i charArray.length; i+) /休眠一秒钟System.out.print(charArrayi); catch (InterruptedException e) e.printStackTrace();public static void main(String a
16、rgs) Thread t = /实例化线程对象/启动线程三、判断题1、启动多线程必须调用 start()方法, 如果调用 run 方法则没有启动新的线程 。( )2、run 方法是运行线程的主体,若 run 方法运行结束,线程就消亡了。 ( )3、线程可以用 yield 使同优先级的线程运行。 ( )4、要在程序中实现多线程,必须在源程序前面使用 import 语句显示的导入 Thread 类。 ( )5、一个线程创建并启动后,它将执行自己的 run()方法。 ( )6、线程可以用 yield 方法使较低优先级的线程运行。 ( )7、每个 Java 线程的优先级都设置在常数 112 之间,默
17、认的优先级设置为常数 6。 ( )四、简答题1、阅读下面的程序,修改程序中错误的地方:1. public class Test implements Runnable 2. String str=new String10;3. for (int i = 0; i str.length(); i+) 4. stri=i+”-”;5. 6. public void run() 7. try 8. for (int i = 0; i str.length(); i+) 9. sleep(1000);10. System.out.print(stri);11. 12. catch (Interrupt
18、edException 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、线程的基本概念、线
19、程的基本状态以及状态之间的关系8、线程的同步、如何实现线程的同步9、同步和异步有何异同,在什么情况下分别使用他们?举例说明。10、什么是死锁 11、什么是线程饿死,什么是活锁? 12、解释实现多线程的几种方法? Java 线程可以实现 Runnable 接口或者继承 Thread 类来实现,当你打算多重继承时,优先选择实现 Runnable。 13、Thread.start ()与 Thread.run ()有什么区别? 14、为什么需要 run ()和 start ()方法,我们可以只用 run ()方法来完成任务吗? 15、什么是 ThreadLocal 类,怎么使用它? 16.在静态方法
20、上使用同步时会发生什么事? 17、使用 java 语言如何创建线程对象?请列出常用的两种方法。 18、线程之间通信的方法有哪几个?分别起到什么作用? 四、编程题1、应用 Java 中线程的概念,编写一个 Java 程序(包括一个主程序类,一个 Thread类的子类) 。在主程序中创建 2 个线程(用子类) ,将其中一个线程的优先级设为10,另一个线程的优先级设为 6。让优先级为 10 的线程打印 200 次“线程 1 正在运行” ,优先级为 6 的线程打印 200 次“线程 2 正在运行” 。(提示:设置线程优先级用 setPriority 方法) 2、假设一个银行的 ATM 机,它可以允许用
21、户存款也可以取款。现在一个账户上有存款 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)
22、 将新生成的账户结果 250 返回到 ATM 机的服务器上,耗时 2s。请根据以上要求,将 A 的操作和 B 的操作分别用线程来表示,编写一个 Java 程序实现该功能。3、请编写一个类,类名为 Sub Thread, 是 Thread 类的子类。该类中定义了含一个字符串参数的构造方法和 run()方法,方法中有一个 for 循环,循环一共进行 5 次,循环体先在命令行显示该线程循环了第几次,然后随机休眠小于一秒的时间,循环结束后显示线程结束信息:线程名+finished 。 编写一个Application 程序,并在其中创建 Sub Thread 类的三个线程对象 T1,T2,T3,他们的名
23、称分别为 Frist,Second,Third,并启动这三个线程4、请编写一个类,类名为 MulThread,定义含一个字符串的构造方法,并实现Runnable 接口,接口中的 run()方法如下实现:方法先在命令行显示该线程信息,然后随机休眠小于一秒的时间,最后显示线程结束信息:finished+线程名。编写一个 Application 程序,在其中通过 Runnable 创建 MUlThread 类的三个线程对象 T1,T2,T3,并启动这三个线程。 5、假设某家银行可接受顾客的汇款,每进行一步汇款,便可计算出汇款总额。现有两名顾客,每人都分 3 次.每次 100 元将钱汇入。试编写一个程
24、序,来模拟顾客的汇款操作。 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 个端口。