【多线程】多线程基础

1.1 进程和多线程的概念及线程的优点

进程:操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理机上顺序执行所发生的活动,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
线程:进程中独立运行的子任务。
多线程的优点:可以在同一时间内运行更多不同类的任务。(异步)

1.2 使用多线程

继承 thread类和实现runnable接口
使用多线程技术时,代码运行结果与代码执行顺序或调用顺序是无关的。
cpu执行哪个线程具有不确定性
Thread.java类中的start()方法通知"线程规划器"此线程已经准备就绪,等待调用线程对象的run()方法。
实现Runnalbe接口:如果想创建的线程类已经有一个父类了,这时就不能再继承Thread类了,因为java不支持多继承,所以就需要实现Runnable接口来应对这样的情况。
实例变量与线程安全:   自定义线程类的实例变量针对其他线程可以有共享与不共享之分,这个在多线程之间进行交互时时一个很重要的技术点
在run方法前加入synchronized关键字


1.3 currentThread()方法
currentThread()方法可以返回代码段正在被哪个线程调用的信息


1.4 isAlive()方法
判断当前的线程是否处于活动状态。活动状态就是线程已经启动且尚未终止,线程处于正在运行或准备开始的状态,就认为线程是“存活”的。


1.5 sleep()方法
在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),当前线程指的是this.currentThread()返回的线程。


1.6 getId()方法
取得线程的唯一标识。


1.7 停止线程
停止就是在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。Thread.stop 可以停止一个线程,但是最好不要用,这个方法不安全。已经被作废了。
1、java有以下3中方法可以终止正在运行的线程
1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
2)使用stop方法强行终止线程,但是你推荐使用,它和suspend和resume一样,都是作废过期的方法,使用它们可以产生不可预料的后果。
3)使用interrupt方法中断线程。
2、判断线程是否是在停止状态
1)this.interrupted():测试当前线程是否已经中断。测试当前线程是否已经中断,线程中断由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用返回false(在第一次调用已经清楚了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
2)this.isInterrapted():测试线程是否已经中断。但不清除状态标志
3、能停止的线程——异常法
1)用for语句判断一下线程是否是停止状态,如果是停止状态,则后面的代码不再运行即可

4、在沉睡中停止
如果线程在sleep状态下停止 是什么效果?
从打印结果来看,如果在sleep状态下停止某一线程,会进catch语句,并且清除停止状态值,使之变成false。
5、能停止的线程——暴力停止
stop停止,是暴力的
6、方法stop()与java.lang.ThreadDeath异常
调用stop方法时会抛出ThreadDeath异常,但通常情况下不需要显式捕捉。方法stop()已经被作废,因为如果强
制让线程停止则可能使一些清理性的工作得不到完成。另外一个情况就是对锁定的对象进行了“解锁”,导致数
据得不到同步的处理.出现数据不一致的问题。
7、释放锁的不良后果
使用stop()释放锁将会给数据造成不一致性的后果,如果出现这样的情况,程序处理的数据就可能遭到破坏,最
终导致程序执行的流程错误。
8、使用return停止线程
将方法interrupt()和return结合使用,也可以实现停止线程的效果。


1.8暂停线程
1、supend与resume方法使用

2、suspend和resume方法的缺点——独占,不同步
使用这两个方法,如果使用不当,极易造成公共的同步对象的独占,使其它线程无法访问公共同步对象。
这两个方法还会出现因为线程的暂停而导致数据不同步的情况。


1.9 yield方法
作用:放弃当前cpu的资源,将它让给其他任务去占用CPU执行时间。但是放弃时间不确定,有可能刚刚放弃,马上
又获得cup执行时间




1.10 线程优先级
在操作系统中,线程可以分优先级,优先级高的先得到CPU资源,也就是CPU优先执行优先级高的任务,设置优先级
有助于帮“线程规划器”确定下一个选择哪一个线程来优先执行,设置线程优先级使用setPriority()方法。java中优
先级分为1~10,如果小于1或大于10,则JDK就出异常throw new IllegalAgrumentException();JDK中使用3个常量来
预置定义优先级的值

1、优先级具有继承性,如果A调用B的线程,那么B的线程优先级和A一样
2、规则性:高级优先级总是大部分先执行完,但不是全部先执行完,线程优先等级差距很大的时候,谁限制性完和
代码的调用顺序无关。
3、随机性:因为线程的随机性,所以不一定是高优先级的全部都先执行完。而且,不要把线程的优先级与运行结果
的顺序作为衡量标准,优先级较高的线程不一定每次都嫌执行完run方法中的任务,也就是 线程的优先级与打印顺序
无关。
4、守护线程
线程分为用户线程,和守护线程。
守护线程:是一种特殊的线程,如果进程中不存在非守护线程,守护线程自动销毁,典型的守护线程是垃圾回收线程
守护线程随JVM一同结束工作。守护线程典型的应用就是GC(垃圾回收器),它就是一个很称职的守护      
   者

总结:

    要想用多线程,基础是少不了的

猜你喜欢

转载自blog.csdn.net/zhang18330699274/article/details/80788936