1.进程是系统进行资源分配和调度的基本单元,是线程的容器,可以被认为是程序的实体.
2.线程是一种轻量级的进程,一个进程可以创建多个线程,这些线程内部各有自己的堆栈区域和局部变量等属性,并且可以访问共享的内存变量.
使用多线程的好处
1.使用多线程可以减少程序的响应时间.
2.与进程相比,线程的创建和切换消耗更小,并且多线程在数据共享方面效率非常高.
3.多线程可以重复利用计算机资源.
4.多线程的使用使得程序便于理解和维护.
线程的5种状态
1.NEW,创建状态;
程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时它已经有了相应的内存空间和其他资源,但还处于不可运行状态。
2.就绪状态 Runnable状态
新建线程对象后,调用该线程的 start() 方法就可以启动线程。当线程启动时,线程进入就绪状态。此时,线程将进入线程队列排队,等待cpu获取资源
3. 运行状态 Run
当就绪状态被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的 run() 方法。run() 方法定义该线程的操作和功能。
4. 阻塞状态 Blocking
一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作,会让
CPU 暂时中止自己的执行,进入阻塞状态。在可执行状态下,如果调用sleep(),suspend(),wait()
等方法,线程都将进入阻塞状态,发生阻塞时线程不能进入排队队列,只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。
5.死亡状态
线程调用 stop() 方法时(stop方法已过时)或 run() 方法执行结束后,即处于死亡状态。处于死亡状态的线程不具有继续运行的能力。
可能也会因为异常导致run方法结束,此时线程也是处于死亡状态.
另外,也可能会有waiting等待状态(线程暂时不活动,并且不运行任何代码,这将消耗最少的资源,等待被调度器重新激活);超时等待状态Timed waiting状态,和等待状态不同的是,超过指定的时间自行返回的.
在java中每次运行至少启动几个线程?
答;至少启动两个线程,我们知道java的垃圾回收机制和内存分配是独立的;每次java启动一个类的时候,就是创建了一个JVM,每一个jvm实际上就是启动了一个线程,而java是具有垃圾回收机制的,所以至少启动了两个线程.一个是main线程一个是垃圾回收线程.
线程的强制执行
在线程操作中,可以使用 join() 方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。
线程的休眠
在程序中允许一个线程进行暂时的休眠,直接使用 Thread.sleep() 即可实现休眠。
线程的礼让
在线程操作中,也可以使用 yield() 方法将一个线程的操作暂时让给其他线程执行
线程的优先级
在 Java 的线程操作中,所有的线程在运行前都会保持在就绪状态,那么此时,哪个线程的优先级高,哪个线程就有可能会先被执行。
一个多线程的程序如果是通过 Runnable 接口实现的,则意味着类中的属性被多个线程共享,那么这样就会造成一种问题,如果这多个线程要操作同一个资源时就有可能出现资源同步问题。
解决方法:
死锁
同步可以保证资源共享操作的正确性,但是过多同步也会产生问题。例如,现在张三想要李四的画,李四想要张三的书,张三对李四说“把你的画给我,我就给你书”,李四也对张三说“把你的书给我,我就给你画”两个人互相等对方先行动,就这么干等没有结果,这实际上就是死锁的概念。
所谓死锁,就是两个线程都在等待对方先完成,造成程序的停滞,一般程序的死锁都是在程序运行时出现的。
本文非原创,参考链接如下.
https://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650241563&idx=1&sn=3000d8a03d639c978034df0d651e269d&chksm=88638b74bf14026203d1b04f9df8bf29e40d76e3a65ed7ef3765e5b1d579d86abd4b9b57ef8d&mpshare=1&scene=23&srcid=1016Z1hNrbfVE5quWwWpLMOJ#rd