线程、多线程与线程池面试题

线程、多线程与线程池面试题●概念线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对…

大家好,又见面了,我是你们的朋友全栈君。

 

● 概念

线程:进程中负责程序执行的执行单元。一个进程中至少有一个线程。

多线程:解决多任务同时执行的需求,合理使用CPU资源。多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多   线程运行具有不确定性。

线程池:基本思想还是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。

 

● 线程

创建线程的两种方式:

一、继承Thread类,扩展线程。


class DemoThread extends Thread { @Override public void run() { super.run(); // Perform time-consuming operation... } } DemoThread t = new DemoThread(); t.start(); 
  • 继承Thread类,覆盖run()方法。
  • 创建线程对象并用start()方法启动线程。

面试题

  • 1)线程和进程有什么区别?

一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

 

  • 2)如何在Java中实现线程?

创建线程有两种方式:
一、继承 Thread 类,扩展线程。
二、实现 Runnable 接口。

  • 3)Thread 类中的 start() 和 run() 方法有什么区别?

调用 start() 方法才会启动新线程;如果直接调用 Thread 的 run() 方法,它的行为就会和普通的方法一样;为了在新的线程中执行我们的代码,必须使用 Thread.start() 方法。

二、实现Runnable接口。

 

  • 1)用 Runnable 还是 Thread ?

我们都知道可以通过继承 Thread 类或者调用 Runnable 接口来实现线程,问题是,创建线程哪种方式更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口更好了。

● 线程的状态以及状态之间的相互转换

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:

(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。

(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

 

  • wait和sleep的区别:

 

       线程访问:

              锁池状态,之后等待锁释放,然后访问代码

              wait

              等待队列(释放资源)—>调用notify或者notifyall之后锁池状态—>( 等待锁释放)—>可运行状态—>运行状态—->访 问代码

              sleep,join

              不释放资源–>结束后直接进入可运行状态—>运行状态—->访问代码

 

一个java控制台程序,默认运行两个线程,一个主线程,一个垃圾回收线程。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139890.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vscode打个感叹号就出现html_为什么vscode输入叹号没反应

    vscode打个感叹号就出现html_为什么vscode输入叹号没反应关于Vscode自动更新后按!或按!+tab键不能自动生成html模板的问题和解决方法

    2022年8月22日
    86
  • JS生成随机数的算法

    JS生成随机数的算法关于随机数的过程解释:1>.Math.random()表示生成[0,1)的数,所以Math.random()*5生成的都是[0,4]的随机整数。2>Math.floor(num);参数num为一个数值,函数结果为num的整数部分。3>.Math.round(num);参数num为一个数值,函数结果为num四舍五入后的整数。4>.Math.cei…

    2022年7月14日
    19
  • mysql查找最后一条记录_mysql查询记录总数

    mysql查找最后一条记录_mysql查询记录总数首先要确定什么是最后一条。是编辑时间最新的为最后一条,还是某个字段数字最大的未最后一条。比如以时间最大为最后一条,则将符合条件的资料都筛选出来,再按时间排序,再取一笔资料。SQL如下:selecta,bfromtablewherea>’某个时间’orderbyadesclimit1(上面SQL中a为时间)。用max(time)查询方可!!…

    2022年9月7日
    0
  • java全套视频教程资料

    java全套视频教程资料学完以上内容以后,你应该对Java有一个基本的了解了,你可以用Java语言写出一些简单的程序,并且你用的是简单的编辑器,比如记事本。这个时候,不要急于进入下一部分,留下几天好好写一些程序,尽可能熟悉这

    2022年8月6日
    6
  • 接口(Api)版本号命名规则

    接口(Api)版本号命名规则0.前言版本号的命名和更新问题,是开发者的责任感和前瞻性的问题。1.项目立项时版本格式:0.0.02.开发阶段时此时系统尚不稳定,随时可能增减或者修正API。版本格式:0.次版本号.修订号,版本号递增规则如下:主版本号:0表示正在开发阶段;次版本号:增加新的功能时增加;修订号:只要有改动就增加。3.开发完成后,发布API,或进入二方库时此时系统已经基本稳定…

    2022年9月11日
    0
  • 陕西勉县旅游策划方案——打造三国之都!

    陕西勉县旅游策划方案——打造三国之都!陕西勉县旅游策划方案————打造三国之都熊大寻旅游策划公司/文陕西勉县——三国文化的集散地,以其包容与大气,为三国文化的爱好者铺排了强健的精神底色,给予了所有三国迷体验历史的自信和豪情。2009年8月,受陕西勉县县政府的邀请,熊大寻旅游策划公司和旅游规划公司来到勉县,为其城市旅游进行整体策划。熊大寻旅游策划公司和旅游规划公司在考察走访完勉县所有旅游景点,并消话完项目资料后,对勉县做出了系统…

    2022年6月6日
    136

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号