一、填空题
处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入____阻塞_____状态。
处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。上述线程是处于就绪状态。
解析: 线程的生命周期—五个阶段
新建状态---- new关键字创建线程对象
就绪状态---- start()方法运行之前
运行状态---- run()方法的运行
堵塞状态--- interrupt() sleep() join() yield() wait() 等方法
死亡状态--- stop()方法(已过时) /或run()方法运行结束
一个正在执行的线程可能被人为地中断,让出CPU的使用权,暂时中止自己的执行,进入阻塞状态。
解析:人为的中断正在执行的线程---- 执行wait() 、interrupt() 、sleep()方法等
在Java中编写实现多线程应用有两种途径:一种是继承Thread类创建线程,另一种是实现Runnable接口创建线程。
解析: 继承Thread类来创建线程,不能实现资源的共享,除非资源使用static修饰。
实现Runnable接口创建线程,此时还需要借助Thread类,因为Runnable接口
没有start()方法,同时Thread类是Runnable接口的子类….
在线程控制中,可以调用_____join()____方法,阻塞当前正在执行的线程,等插队线程执行完后后再执行阻塞线程。
多线程访问某个共享资源可能出现线程安全问题,此时可以使用______synchronized_____关键字来实现线程同步,从而避免安全问题出现,但会影响性能,甚至出现死锁。
在线程通信中,调用wait( )可以是当前线程处于等待状态,而为了唤醒一个等待的线程,需要调用的方法是____notify()/notifyAll()__________。
解析:线程等待使用wait()方法,此方法最先是存在于Object类,Thread类继承Object类,可以获取此方法,同时notify()方法和notifyAll()方法---线程唤醒,最先也是存在于
Object类当中。
在线程通信中,可以调用wait()、notify()、notifyAll()三个方法实现线程通信,这三个方法都是____Object____类提供的public方法,所以任何类都具有这三个方法。
二、选择题
1.
下列关于Java线程的说法正确的是(A)。(选择一项)
A
每一个Java线程可以看成由代码、一个真实的CPU以及数据三部分组成
B.
创建线程的两种方法中,从Thread类中继承方式可以防止出现多父类的问题
C.
Thread类属于java.util程序包
D.
使用new Thread(new X()).run();方法启动一个线程
解析:
A、语句正确。
B、创建线程两种方法:一是继承Thread类,一是实现Runnable接口
根据Java语言类的单继承特性,防止出现多继承,但是可以实现多
重继承,也可以出现多父类。
C、Thread类是存在于java.lang包下
D、启动一个线程是调用start()方法,之后JVM会默认的调用run()方法
run()方法是线程的主体,核心代码放到此方法当中。
2.
以下选项中可以填写到横线处,让代码正确编译和运行的是( AD)。(选择一项)
public class Test implements Runnable {
public static void main(String[] args) {
___________________________________
t.start();
System.out.println("main");
}
public void run() {
System.out.println("thread1!");
}
}
A.
Thread t = new Thread(new Test());
B.
Test t = new Test();
C.
Thread t = new Test();
D.
Thread t = new Thread();
解析:
线程的创建有两种方式,其中之一就是实现Runnable接口。
此接口只有一个抽象方法---run()方法,启动线程又需要start()方法
此时还需要借助Thread类,根据Thread类的构造方法:
Public Thread(Runnable run)
需要传入Runnable接口对象
此题还有一个方法: 直接创建Thread类对象,调用start()方法
所以D选项也是正确的,但是此题重点还是考的子类实现Runnable接口
根据Thread类的构造方法启动线程。
3.
如下代码创建一个新线程并启动线程,问:四个选项中可以保证正确代码创建target对象,并能编译正确的是(C)?(选择一项)
public static void main(String[] args) {
Runnable target=new MyRunnable( );
Thread myThread=new Thread(target);
}
A
public class MyRunnable extends Runnable {
public void run( ) { }
}
B.