多线程作业

来源:互联网 发布:linux ip 流量 编辑:程序博客网 时间:2024/06/06 09:04

多线程
一、判断题(T为正确,F为错误),每题1分
1.如果线程死亡,它便不能运行。(T)
2.在Java中,高优先级的可运行线程会抢占低优先级线程。( F)
3.线程可以用yield方法使低优先级的线程运行。(F)//暂停
4…程序开发者必须创建一个线程去管理内存的分配。(F)
5.一个线程在调用它的start方法,之前,该线程将一直处于出生期。( T)
6.当调用一个正在进行线程的stop( )方法时,该线程便会进入休眠状态。(F)
7.一个线程可以调用yield方法使其他线程有机会运行。(F)
8. 多线程没有安全问题(F)
9. 多线程安全问题的解决方案可以使用Lock提供的具体的锁对象操作(T)
10. Stop()方法是终止当前线程的一种状态(F)

二、选择题(不定项选择题),每题2分
1.Java语言中提供了一个▁线程,自动回收动态分配的内存。D
A.异步
B.消费者
C.守护
D.垃圾收集
2.Java语言避免了大多数的▁错误。C
A.数组下标越界
B.算术溢出
C.内存泄露
D.非法的方法参数
3.有三种原因可以导致线程不能运行,它们是▁。ABC
A.等待
B.阻塞
C.休眠
D.挂起及由于I/O操作而阻塞
4.当▁方法终止时,能使线程进入死亡状态。A
A.run
B.setPrority//更改线程优先级
C.yield//暂停当前线程的执行 执行其他线程
D.sleep//线程休眠
5.用▁方法可以改变线程的优先级。B
A.run
B.setPrority
C.yield
D.sleep
6.线程通过▁▁方法可以使具有相同优先级线程获得处理器。A
A.run
B.setPrority
C.yield
D.sleep
7.线程通过▁▁方法可以休眠一段时间,然后恢复运行。D
A.run
B.setPrority
C.yield
D.sleep
8.方法resume( )负责重新开始▁▁线程的执行。D
A.被stop( )方法停止
B.被sleep( )方法停止
C.被wait( )方法停止
D.被suspend( )方法停止
9.▁▁方法可以用来暂时停止当前线程的运行。BC
A.stop( )
B.sleep( )
C.wait( )
D.suspend( )
10. 请问下列哪些类是定义在java.io包中的抽象类(ABD)
A. InputStream
B. OutputStream
C. PrintStream
D. Reader
E. FileInputStream
F. FileWriter

三、简述题,每题5分
1.简述程序、进程和线程之间的关系?什么是多线程程序?
进程是系统分配资源调用的一个独立单位. 正在运行的程序就是一个进程.
线程依赖于进程而存在,一个线程相当于进程中的某个任务.
多线程程序:一个程序中开启了多个任务,具有多线程环境,有共享数据,有多条语句对共享数据进行操作。

3.什么是线程调度?Java的线程调度采用什么策略?
为了保证线程按照一定的规则执行而采取的措施叫做线程调度。
线程调度策略分为两种:
抢占式调度。
抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。
过程:一个线程运行一个时间片,再切换到第二个线程运行一个时间片………直到最后一个线程,CPU在各线程之间来回切换,直到最后一个线程执行完毕。
协同调度。
协同式调度指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,一个人跑完自己的路程就把接力棒交接给下一个人,下个人继续往下跑。线程的执行时间由线程本身控制,线程切换可以预知,不存在多线程同步问题,但它有一个致命弱点:如果一个线程编写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃。

4.如何在Java程序中实现多线程?
方式一:继承自Thread类实现
1)自定义一个类继承Thread类
2)在该类中重写run方法
3)在main中创建该类的对象,启动线程
方式二:实现Runnable接口
1)自定义一个类实现Runnable接口
2)重写接口中的run方法
3)在main中创建该类的实例对象
4)创建Thread类的对象,将该类的实例对象作为参数进行传递。
5)启动线程
方式三:通过Callable接口
1)自定义一个类实现Callable接口
2)在该类中重写call方法
3)利用工厂类:Executors的newFixedThreadPool方法创建线程池对象
4)通过所创建的线程池对象,将自定义的实现Callable接口的类对象作为参数,提交异步任务。
5)调用Future接口中的get方法返回具体的结果

  1. 试简述Thread类的子类或实现Runnable接口两种方法的异同?、
    6)相同点:都需要重写run方法
    不同点:因为java中为了避免类的多重继承所带来的混淆,所以只允许类的单继承,但是允许接口的多实现。所以继承自Thread类的方式,具有局限性。
    而实现接口的方式使用更普遍,一个类可继承多个接口。
    然后就是两者的需要创建线程时的方式不同了。使用自定义类继承Thread的方式,只需实例化该类对象,然后启动就好了,而采用自定义类实现接口的方式,需要实例化该类的对象再将其作为new Thread()的参数创建一个Thread对象,再启动线程。

  2. 说明缓冲流的优点和原理
    原理:缓冲流在进行读写文件时会提供一个缓冲区数组(内存中),在读文件时可根据需要从包含的输入流填充该内部缓冲区,一次填充多个字节或字符。在写文件时输出缓存流调用write方法将数据写在缓冲区中,等到缓冲区满了之后才将数据发送到目的地(文件或磁盘).所以写入缓冲区的数据太小时,就经常会写不到指定文件中,所以最好在调用write方法后再调用flush方法,强制的将缓冲区中的数据发送到流中,而不必等到缓冲区满.

优点:相对于基本流字节或者字符流是直接对目的地进行读写的,相当于读一个写一个效率比较低。而使用缓冲流避免了多次访问文件,提高了读写速度。

8:在Java中wait()和sleep()方法的不同?
(1)wait方法来自Object针对的是需要同步的对象
Sleep方法来自Thread类针对的是某个线程
(2)sleep方法没有释放锁,而调用wait方法释放了锁,这使其它线程可以使用同步代码块或同步方法。
(3)Wait方法只能在同步代码块或同步方法中使用,而sleep方法可以在任何地方使用。

(4)sleep方法属于Thread类中方法,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态,因为线程调度机制恢复线程的运行也需要时间,一个线程对象调用了sleep方法之后,并不会释放他所持有的所有对象锁,所以也就不会影响其他进程对象的运行。
注意sleep()方法是一个静态方法,也就是说他只对当前对象有效,通过t.sleep()让t对象进入sleep,这样的做法是错误的,它只会是使当前线程被sleep 而不是t线程
wait属于Object的成员方法,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程;如果线程拥有某个或某些对象的同步锁,那么在调用了wait()后,这个线程就会释放它持有的所有同步资源,而不限于这个被调用了wait()方法的对象。

9:Java中Runnable和Callable有什么不同?
(1)Callable规定的方法是call(),Runnable规定的方法是run()。其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。
(2)Callable的任务执行后可返回值,而Runnable的任务不能返回值
(3)call方法可以抛出受检查的异常,run方法不可以
(4)运行Callable任务可以拿到一个Future对象,再通过这个对象调用get方法得到计算结果。

四、程序设计题
http://note.youdao.com/noteshare?id=e7382f8c99e3a1d634cc707a92d000f6&sub=A0A335CE1C424670AA4704998A26803A
1.编写一个应用程序,在线程同步的情况下来实现“生产者―消费者”问题。
2.修改上题,由于各个线程是异步运行的,因此无法预计其相对速度,为了使生产者能够不断地生产,可以使用循环缓冲区,保证有足够多的内存区保存更多的产品。(生产者——仓库——消费者)

3 :
1)将若干个Student对象;若干个Teacher对象,写出到d:/0404/a.txt中,
2)将该文件中所有的Student对象反序列化回来,装入List,所有的Teacher对象反序列化回来装入另一个List

4:实现字符串和字节数组之间的相互转换,比如:将字符串”西部开源技术中心xbkyjszx”转换为字节数组,并将字节数组再转换回字符串!
5:用Java编程一个会导致死锁的程序,你将怎么解决?请你设计

6:递归实现输入任意目录,列出文件以及文件夹

原创粉丝点击