总结多线程学习中遇到的一些基本问题

1、什么是进程什么是线程?

进程是操作系统管理的基本运行单元。而线程可以理解为进程下属的任务单元。在一个进程中,可以有多个线程,他们之间共享内存资源。

2、进程和线程的区别?

从创建的先后顺序来看:先有进程后有线程。

从资源分配方面来看:进程拥有独立的操作系统资源,如内存、网络端口,进程之间是独立的,但是可以通过socket或http传输协议进行通信。线程之间的资源是共享的,他们共用进程所提供的操作系统资源

从资源调度的耗时来看,线程的资源调度时间成本比较高

3、为什么要使用多线程技术?

单线程技术存在的缺陷:当任务队列中存在多个任务时,使用单线程处理只能处理单个任务,当任务队列中耗时较长的任务靠近队头时,在处理该任务,后续队列中的耗时较短的任务仍需要等待很长时间,这样的处理方式不合理,大大降低了系统运行的效率。

4、采用多线程技术的优势:通过创建线程,将任务放到不同的线程中执行,此时,CPU在处理任务时不会将当前任务完全解决才继续执行后续任务,通过给每个线程设置时间片,CPU对每个线程只处理一段时间,若任务未处理完,则将任务从新放置到任务队列中,周而复始。线程处理任务的时间由操作系统分配,通过这种方式,耗时短的任务可以快速处理,耗时长的任务,也能被逐步解决。

5、线程中Start()方法和run()方法被对象直接调用的区别?

Start()方法:操作系统会创建一个新的线程,该线程执行run()方法里的语句,由于创建了新的线程,run()方法由线程执行,与主线程是异步的,即执行run()方法里的语句所花时间由操作系统决定。

Run()方法:这里指的是通过线程对象直接调用run()方法,通过这种方式执行run()方法中的语句是由主线程执行的,也就是说此时的run()方法与其他普通函数无异。

6、什么是非线程安全问题?

当多个线程同时对同一个共享资源进行操作时出现的错误

7、如何避免非线程安全问题?

加上锁的机制,在run()方法执行前通过synchronized关键字修饰run()方法,对run()方法上锁,上锁后run()方法中的代码就变为不可访问,只有当线程执行完run()方法后主动解锁,才可以让其他线程继续使用,既保证run()方法执行过程的唯一性。

被加锁的代码区被称为:临界区、互斥区

8、停止线程的几种方式

Interrupt()方法:本质是给线程一个中断信号,使得受阻线程退出阻塞状态,因此使用interrupt()方法后仍可继续执行后面的语句。

Stop()方法:强制退出,这种方法容易造成不稳定性,如当线程在处理数据时使用stop()方法强制退出,正在被处理的数据可能存在缺失或错误的情况,以及其他不确定结果,因此stop()方法现在已被淘汰。

使用return终止线程:在run()方法中加入return语句。

9、Interrupted()方法和isinterrupted()方法的区别?

Interrupted()方法:如果当前线程已被中断,则清除当前线程当前中断状态并返回true,因此当已中断的线程对象连续两次使用Interrupted()方法,第二次输出结果为false。如果当前线程未被中断则同样返回false

isinterrupted()方法:如果当前线程已被中断返回true,不会清除当前线程的中断状态。如果当前线程未被中断则返回false

10、线程的暂停

Suspend()方法与resume()方法的介绍及其缺点:

Suspend()方法的功能是使当前正在运行的线程阻塞,resume()则是与之相匹配,将阻塞的线程唤醒。Suspend()方法有一个特点,就是在阻塞的状态下不会释放锁,这也就有可能导致死锁的现象,假如,当线程1需要同时访问A临界区和B临界区中的资源,当线程进入A临界区时,上锁,此时又有另一个线程2与之需求相同,但他优先占用了B临界区的资源,此时只能阻塞等待,当线程1调用了suspend()方法阻塞后,由于对A临界区上了锁,导致线程2无法访问A临界区的资源,于是乎线程2也进入到阻塞状态,两者都分别给AB临界区上了锁,却又无法解开,造成死锁现象。

Suspend()方法还可以使得线程在main方法结束后继续运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值