这是和线程相关的练习题,共分为...

概念

Thread类

1.为什么重写run方法?

2.run()与start()的区别?

3.一个实现了线程的对象调用两次start方法会发生什么?

4.优先级高的线程先执行,对嘛?

5.join()与sleep()的区别?

6.以下代码执行stop()与interrupt()的运行结果分别是?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Thread my = new Thread(){
@Override
public void run() {
System.out.println("我现在要休息10秒 "+new Date()); //①
try {
Thread.sleep(10000);
System.out.println("我醒来了"); //②
} catch (InterruptedException e) {
System.out.println("休息结束了,出现了异常 "+new Date()); //③
}finally {
System.out.println("带上装备,开工! "+new Date()); //④
}
System.out.println("我休息好了 "+new Date()); //⑤
}
};
my.start();
try {
Thread.sleep(1000);
//my.stop();
//my.interrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
7.请问以下程序的执行结果是什么?
1
2
3
4
5
6
7
8
9
10
11
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("hello");
}
}){
@Override
public void run() {
System.out.println("world");
}
}.start();

Runnable接口

1.对比继承Thread类实现接口方式的好处是什么?

2.

Synchronized

答案

概念

thread类

为什么重写run方法

不是所有代码都需要被线程执行,为了区分被线程执行的代码,java提供Thread类的run方法包含被执行的代码
一般来说,被线程执行的方法比较耗时

run()与start()的区别?

run()仅仅是封装被线程执行的普通代码,直接调用是普通方法
start()首先启动了线程,然后由jvm调用线程的run方法

一个实现了线程的对象调用两次start方法会发生什么?

抛IllegalThreadStateException非法线程状态异常,一个线程只能启动一次.

优先级高的线程先执行,对嘛?

不对,优先级高仅仅表示获取CPU执行权的概率高。要多次运行才能看出效果,存在随机性

Thread的join()与sleep()的区别?

首先sleep是静态方法而join是普通成员方法
调用线程对象的join方法可使得指定时间之后再执行后面的代码,这和sleep没什么区别
但是当join不设置值或者0的时候可以等待调用的线程对象执行完毕,而sleep只能估算时间

以下代码执行stop()与interrupt()的运行结果分别是?

stop : ①,③ ; interrupt : ①,③,④,⑤
stop是直接中断线程,不会抛出异常,但是如果在try块内终止,会执行finally块
interrupt是抛出异常形式的中断

第7小题

运行结果为world;这个题考察的对线程及匿名内部类和java继承机制的了解
首先前面部分是调用Thread的构造方法并传入匿名内部类,run方法被其覆盖
后面的部分,实例对象后面如果带{}代表匿名子类而重写了run方法
故而结果为world,如果在匿名子类内调用super.run();会得到结果hello

Runnable接口

对比继承Thread类实现接口方式的好处是什么?

避免了单继承的问题带来的局限性
适合多个相同程序的代码处理同一个资源的情况,把线程同程序的代码、数据有效的分离
    也就是一个对象可以让多个线程执行它,而继承方式是一个对象一个线程