Java多线程之常见面试题

1、sleep()和wait()的异同点是什么?
相同点:都可以让线程处于等待状态;
不同点

  1. sleep必须指定时间;
    wait可以指定时间,也可以不指定时间
  2. sleep时间到,线程处于就绪或者运行状态;
    wait如果没有时间,必须要通过notify或notifyAll唤醒。
  3. sleep不一定非要定义在同步中。
    wait必须定义在同步中。
  4. 若都定义在同步中时,
    线程执行到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();;

执行结果为:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值