CPU在不同的线程上进行切换是需要耗时间的,不是创建的线程越多运行效率越高
实现thread的方式
继承thread类实现多线程
多线程运行的结果时间上具有不确定性
如果直接调用run方法,则线程对象不交给“线程规划器”来进行处理,而是run方法是直接由调用run方法(如果在main函数中调用,则体现出来的是同步)。
【如果多个线程调用start启动,不是按照顺序进行启动的】
使用runnable
【通过实现Runnable接口,避免线程已经有父类,无法继承Thread的情况】
注:
1)在非线程安全情况下,JVM中的加减操作分为取数、计算、赋值三步,如果多线程情况下使用大概率会出现问题
共享数据的变量
可以通过添加synchronized方法实现同步,该关键字可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。
currentThread()方法
返回代码段被哪一个线程调用的信息,如果在主线程中则被main线程调用。Run方法是自动调用的方法。
isAlive()方法
判断当前线程是否处于活动状态(线程已经启动,还没有终止时的状态)。
sleep()方法
在指定的毫秒数内让当前“正在执行的线程”休眠,即this.currentThread()返回的线程。
getId()方法
获得线程的唯一标识符
停止线程的方式
一般可采用判断线程是否处于存活状态后,再抛出异常的方式解决问题。不推荐使用stop方法,不确定被执行到哪个步骤了。
暂停线程
可使用suspend()方法暂停线程,使用resume方法恢复线程的执行。这两个方法已过期,两种方法容易造成公共同步对象的独占,和值不同步的情况。
yield()方法,将放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。
继承的优先级
线程级别分为1-10的10个级别,线程会将资源有限调度给优先级更高的线程(但也会有一定的不确定性和随机性)
1)线程的优先级有继承性,A线程启动B线程,则B线程和A线程的优先级是一样的
守护线程
非守护线程结束后,JVM会结束。守护进程不影响JVM结束,即JVM结束了会自动将守护线程关闭。调用setDaemon(true)代码且传入true值的线程才是守护线程。