线程进程的区别和联系 怎么结束一个线程?
1、进程是资源分配的最小单位,线程是资源调度的最小单位。
2、线程是在进程下运行的。一个进程可以包含多个线程。
3、进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间。而线程是共享进程中的数据的,使用相同的地址空间。
4、同一进程下不同线程间数据容易共享,不同进程间数据很难共享。
5、线程之间没有单独的地址空间,一个线程死掉,整个进程也死掉。而一个进程死掉并不会对另外一个进程造成影响。
怎么结束一个线程?
一种:当run方法完成后线程终止
run方法中的内容执行完后线程一般就自动结束了。
第二种:使用stop方法强行终止
该方法会强制关闭正在执行的线程,这种方法是不推荐的,因为假如很多指令正在执行,很多重要操作可能尚未完成,如果强制停止会导致潜在问题,例如一些清理性的工作没完成,如文件,数据库等的关闭。
也就说调用 stop() 方法会立即释放该线程所持有的所有的锁,导致数据得不到同步,出现数据不一致的问题。
第三种:通过发送信号来终止线程
其本质和开启类似,就是主线程给子线程发送一个可以关闭的信号,但是具体什么时候执行关闭由子线程决定。这就像你正在工作,女朋友突然打电话要你和她出去逛街,你说“稍等,我先将手上的工作完成”是一样的道理。也就是说main线程只给子线程发送信号来告知要结束,而不是暴力地直接将其停掉。具体是否要关闭由子线程根据自身状态决定是否停止。
那通过信号停止线程,具体工作是怎么样的呢?应用程序发送一个线程终止的信号给JVM,JVM处理之后转给操作系统,操作系统再转给CPU,CPU收到之后会自行决定是否终止,而不一定马上终止。CPU此时可能在执行某个原子操作,或者要完成finally的功能才终止操作等,也就是会等手头的工作完成再终止(也叫安全点 ,或者安全区域)。
在Java中,主要是通过interrupt和isInterruptted()。
在Thread中提供了一个interrupt()方法,从名字看表示中断,但实际上并不像stop()方法一样直接中断线程,而是向子线程发送一个中断的通知。例如,假如你是领导,对于在加班的同事,你会说”做完就下班吧,其他明天再说“。这就是你给他发的信号量,而不是强制让他走,同事可以根据自己的情况处理完再走,这个时间可能是一分钟,也可能是一小时,决定权在同事这里。这就是信号量的含义,也是线程安全中断的基本模型。
与interrupt()相配合的就是isInterruptted(),功能是判断是否收到了可以中断的请求。例如有的人一下午就看着领导走没走, 只要一走,立马开溜,这就是一直在通过isInterruptted()监听是否可以中断。