你真的懂得守护进程和优先级吗?

1、守护线程

在Java中有两种线程:一种是用户线程,另一种是守护线程。可以通过isDaemon()方法来进行区分,如果返回false,说明该线程是用户线程;如果返回true,则说明该线程是守护线程。
守护线程是指为其他线程服务的线程,也就是“后台线程”,一般用来执行后台任务。守护线程最经典的应用就是GC(垃圾回收器)。

下面使用代码来演示一下:

public class DaemonThread {
	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {

			@Override
			public void run() {
				for (int i = 0; i < 100; i++) {
					try {
						Thread.sleep(10);
					} catch (Exception e) {
					}
					System.out.println("我是子线程 i:" + i);
				}
			}
		});
		// 设置为守护线程
		thread.setDaemon(true);
		thread.start();
		for (int i = 0; i < 30; i++) {
			try {
				Thread.sleep(10);
			} catch (Exception e) {
			}
			System.out.println("我是主线程 i:" + i);
		}
		System.out.println("主线程执行完毕~!");
	}
}

当主线程执行完毕之后,子线程(守护线程)也会停止。

注意点:

  1. thread.setDaemon(true)必须在thread.start()之前设置,否则会抛出IllegalThreadStateException异常;
  2. 在守护线程中产生的新线程也是守护线程;
  3. 不要使用守护线程去访问固有资源,比如读写操作或者计算逻辑。因为它可能会在任何一个时候,甚至是在一个操作的中间发生中断。

2、线程优先级

Java提供了一个线程调度器来监控程序启动后进入就绪状态的所有线程。线程调度器通过线程的优先级来决定调度哪些线程执行。一般来说,Java的线程调度器采用时间片轮转算法使多个线程轮转获得CPU的时间片。然而在实际的情况中,由于每个线程的重要程度不同,有时候我们想让一些线程优先执行,那么我们就可以将它的优先级调高一下,这样它获得的时间片就会多一些。

在java 中线程优先级的范围是1~10,默认优先级为5。“高优先级线程”会优先于“低优先级线程”执行。

class PrioritytThread extends Thread {

	public void run() {
		for (int i = 0; i < 100; i++) {
			System.out.println(Thread.currentThread().getName() + "---"+i);
		}
	}

	public static void main(String[] args) {
		PrioritytThread t1=new PrioritytThread();
		PrioritytThread t2=new PrioritytThread();
        PrioritytThread t3=new PrioritytThread();
		t1.setName("Thread-1");
		t2.setName("Thread-2");
        t3.setName("Thread-3");
		// 注意设置了优先级,不代表每次都一定会先被执行,只是CPU调度会优先分配
		t1.setPriority(10);//优先级必须设置在start之前
        t3.start();
		t1.start();
		t2.start();
	}
}

运行结果
你真的懂得守护进程和优先级吗?_第1张图片
由运行结果可以看出,优先级高的线程不一定比优先级低的线程先执行,而是优先级高的线程先执行的概率比优先级低的线程先执行的概率高。

注意:优先级 thread.setPriority() 必须设置在 thread.start() 之前。

你可能感兴趣的:(Java,面试)