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值的线程才是守护线程。