自我总结线程篇

1.什么是线程

 

线程是操作系统运算调度的最小单位,是实际运作单位。   进程是正在运行着的应用程序。

2.线程五大状态:

创建状态:new:三种方式创建,还没有start

就绪状态:runnable:线程创建之后,调用Thread类的start()方法,进入就绪状态,

运行状态:running:线程得到cpu分配,进入运行状态

阻塞状态:blocked:运行中的线程进入阻塞状态,如调用sleep()方法让线程睡眠,调用wait()方法让线程等待等。

终止状态:(Dead):当线程的run()方法完成时,或者主线程的main()方法完成时,我们就认为它终止了。

3.线程创建方式:

继承Thread类

实现runnable接口

实现callable接口

通过线程池创建

4.用Runnable还是Thread?

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

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

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启 动,start()方法才会启动新线程 
 

6..Java中Runnable和Callable有什么不同?

Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在 JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值(Future对象)和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。
 

7.什么是线程池? 为什么要使用它?

        创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限。为了避免这些问题,在程序启动的时 候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。从JDK1.5开始,Java API提供了Executor框架让你可以创建不同的线程池。比如单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池。

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10, 5, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

参数配置:核心线程数、线程最大数、线程保存时间、线程失效时的返回函数

8.Java中notify 和 notifyAll有什么区别?

notify()方法不能唤醒某个具体的线程,所以只有一个线程在等 待的时候它才有用武之地。而notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程能继续运行。

9.wait, notify 和 notifyAll这些方法不在thread类里面?

他们是针对对象加锁的。

10.为什么wait和notify方法要在同步块中调用?

wait和notify方法执行的时候必须先获得对象,还有一个原因是为了避免wait和notify之间产生竞态条件。

11.Java中的volatile变量是什么

作用于共享变量,保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。volatile保障的是可见性和有序性(禁止指令重排),不保证原子性

12.如何避免死锁?

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去

发生情况:

互斥:一个资源每次只能被一个进程使用

请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放

不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺

循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

如何避免:避免死锁最简单的方法就是阻止循环等待条件,将系统中所有的资源设置标志位、排序,规定所有的进程申请资源必须以一定的顺序(升序或降序)做操作来避免死锁。

13.Java中活锁和死锁有什么区别?

互相避让导致谁也出不去、就是状态可改变但是任然不可以执行。

14.怎么检测一个线程是否拥有锁?ava.lang.Thread中有一个方法叫holdsLock()

15.volatile 变量和 atomic 变量有什么不同? volatile 保证的是可见性和有序性,atomic 保证的是原子性。

16.同步块内的线程抛出异常会发生什么?锁会自动释放

17.Java多线程中调用wait() 和 sleep()方法有什么不同?

wait() 释放锁,sleep()不释放锁。

18.单例模式的双检锁?

既保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。

19.各种锁:https://blog.csdn.net/qq_43542795/article/details/105970892?ops_request_misc=&request_id=&biz_id=102&utm_term=%E9%94%81%E8%86%A8%E6%B6%A8&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-.pc_search_result_control_group&spm=1018.2226.3001.4187

20.很多线程怎么区分是哪个日志?

给线程命名,然后添加append日志到后面;

NIO  BIO AIO 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值