java 线程 常见面试题_Java多线程之常见面试题

1、sleep()和wait()的异同点是什么?

相同点:都可以让线程处于等待状态;

不同点:

sleep必须指定时间;

wait可以指定时间,也可以不指定时间

sleep时间到,线程处于就绪或者运行状态;

wait如果没有时间,必须要通过notify或notifyAll唤醒。

sleep不一定非要定义在同步中。

wait必须定义在同步中。

若都定义在同步中时,

线程执行到sleep,不会释放锁;

线程执行到wait,会释放锁;

2、线程如何停止呢?

stop()方法已经过时了,通过查看API文档stop部分,发现提供了其他的解决方案;

线程结束:就是让线程的任务代码执行完毕,run()方法结束。

run()方法如何结束呢?

run方法中通常都定义循环,则需要控制住循环就行了,即通过定时检查标记,确定循环是否结束。

注意:万一线程在执行过程中处于了等待状态,那它将无法检查标记了。此时通过再次查阅API文档,发现有如下解决办法:如果目标线程等待了过长时间,则应调用interrupt()方法中断该线程;

所谓的中断并不是停止线程,interrupt的功能是:将线程的等待状态清除,让线程恢复到运行状态(即让线程重新具备CPU的执行资格)。因为interrupt是强制性的,所以会有异常发生,可以在catch中捕获异常,在异常处理中,改变标记让循环结束,从而结束该线程的run方法。package thread类测试.终止线程;

public class StopThreadDemo {

public static void main(String[] args) {

StopThread st = new StopThread();

Thread t1 = new Thread(st);

Thread t2 = new Thread(st);

t1.start();

t2.start();

int x = 0;

while(true) {

if(x++ == 50) {

t1.interrupt();

t2.interrupt();

break;

}

System.out.println(Thread.currentThread().getName()+"......"+x);

}

}

}

class StopThread implements Runnable {

private boolean flag = false;

@Override

public synchronized void run() {

while(!flag) {

try {

System.out.println(Thread.currentThread().getName()+" -----> wait()");

wait();

} catch (InterruptedException e) {

changeFlag(); //处理标记,控制线程结束

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName()+"----->");

}

}

public void changeFlag() {

flag = true;

}

}

3、守护线程

守护线程也就是后台线程,一般创建的都是前台线程,可以调用Thread的静态方法setDaemon(true)将线程标记为后台线程。

前台、后台线程运行时都是一样的,获取CPU的执行权执行线程。

只有在结束时不一样,前台线程要通过run方法结束,线程结束;

后台线程也可以通过run方法结束,线程结束,但还有另外一种情况,当进程中所有的前台线程都结束了,这时无论后台线程处于什么样的状态,都会结束,从而进程结束。

进程结束以来的都是前台进程。

4、线程的优先级

用数字标识,范围为1~10,其中默认的初始优先级为5,可以调用setPriority()方法设置线程的优先级,如setPriority(Thread.MAX_PRIORITY);

5、线程组

ThreadGroup,可以通过Thread的构造函数明确新先线程对象所属的线程组。

线程组的好处:可以对多个同组线程,进行统一的操作。默认都属于main线程组。

6、join(),join(time),yield()

join方法:等待当前调用线程执行完毕;

join(time):等待当前调用线程执行time毫秒;

yield:线程暂时停止;

7、new Thread(new Runnable() {

@Override

public void run() {

System.out.println("runnable");

}

}) {

public void run() {

System.out.println("子类");

}

}.start();;

执行结果为:

712

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值