BAT常见面试问题解析之java多线程「第二弹」

来源:互联网 发布:ubuntu route设置 编辑:程序博客网 时间:2024/05/19 23:24

前沿

上一篇文章中对JAVA多线程常见面试问题进行了一些探索与解答,很看看官与粉丝希望多发一些相关的文章,并且加深一些多线程知识的深度,那么这篇文章的知识是由简及深的,希望对各位有一些帮助。

一、进程与线程之间的区别

一个进程是一个独立运行的环境,他可以看作是一个应用程序。例如在windows环境下的.exe可执行文件。而线程则是在进程中运行的一个任务。线程只需要较少的资源就可以创建可驻留,并且线程之间的资源是可以共享的。

二、对线程之间优先级的理解

每个线程都是有优先级的,通常情况下,高优先级的线程在运行过程中会优先获取资源对象,但是线程之间的相互竞争是依赖于线程调度器和操作系统的。我们可以在开发过程中定义线程的优先级,线程优先级是一个int类型的变量,可以是从1-10之间的数字。1代表最低优先级,10代表最高优先级。

三、什么是线程调度器

线程调度器(Thread Scheduler)是一个操作系统的服务,他的职责是为Runnable状态下的线程分配CPU的时间,线程从启动到销毁都是依赖于线程调度器的。线程调度器给线程分配CPU的时间是根据线程的优先级设定以及线程的等待时间的。需要注意的是,在通常情况下最好不要让自己的程序执行依赖于线程优先级,而是让应用程序去自动控制他。

四、如何创建守护线程

Thread类提供了setDaemon()方法用来设置线程为守护线程,只需要设定setDaemon(true)就可以了。这个方法是在start()方法之前调用的,否则会抛出IllegalThreadStateException异常。

五、ThreadLocal是什么

我们知道线程之间是可以共享他所属对象的全局变量的,如果不使用上一篇我们讲到的同步方法或者同步代码块,那么这个线程就是不安全的。那么当我们不想使用同步方法或者同步代码块时,ThreadLocal应运而生。ThreadLocal是用于创建线程本地变量的,这样每个线程就会有他自己的Thread变量,我们可以使用get()|set()方法去获取他们的默认值,也可以在线程内部去改变他们的值。ThreadLocal通常都是私有的(private)、静态的(static)。

ThreadLocal类接口提供了四个方法:

1.void set(Object value);

①.设置当前线程的线程局部变量的值。

2.public Object get();

①.返回当前线程对应的线程局部变量的值。

3.public void remove();

①.将当前线程对应的线程局部变量的值删除。

②.该方法的目的是为了减少内存的占用,但是当线程执行结束后,对应的线程局部变量会自动被回收掉,因 此显示的调用他只是为了加快内存回收的速度。

4.protected Object initialValue();

①.返回该线程局部变量的初始值。

②.该方法是一个protected的方法,是为了让子类覆盖而设计的。这个方法是延迟调用的,只有在线程第1次 调 用get()或set(Object)时才执行,并且仅执行1次。

我们使用以下的一个小例子来结束这篇文章,这个例子是我以前从网上看到的,很不错就保留下来了。

BAT常见面试问题解析之java多线程「第二弹」

代码实例

BAT常见面试问题解析之java多线程「第二弹」

运行结果


从以上运行结果可以看出,虽然每个线程都共享了资源对象的TestNum,但是在各个线程之间在调用过程中并未发生互相干扰的情况,这是因为我们通过ThreadLocal为没个线程提供了一个单独的变量副本。

六、结语

今天这篇文章就先讲到这里,其他的内容会在以后陆续发表出来,大家有什么疑问或者建议可以在留言板告诉我,我会听取大家的建议做相应的修改。希望大家关注本头条号,以便持续获取相关内容。