多线程(三)
等待线程——join()
⭐使用join()方法时,一定要注意放的位置!
线程不能调用自己的join()。
例子:
如果我们创建一个线程,使这个线程计算累加的结果,但打印的却用主线程main来执行,如果我们不使用join()方法来控制,那就会随机执行线程,这是多线程的特点,如下:
⭐如果我们不使用join()方法,线程就会随机调度,出来的结果不是我们想要的。
我们要是使用join()方法,情况就会不一样,如下:
这样我们就得到了我们想要的结果。
例子2:
如果我们使用多个线程,就要严格的要求join()方法的位置,这样代码就不会错乱。
我们创建两个线程,来组成一段 "你好,今天是星期三,你今天上学了吗,今天学校放假了" 这样的话。如果我们不使用join()方法,就会如下:
下面将合理的使用join方法:
⭐想要满意的结果,我们就要学会合理的运用join()方法。
获取线程的引用
public static Thread currentThread(); 返回当前线程对象的引用
线程的状态——getState()
Java中的线程状态分为下面6点:
1、new Thread对象创建好了,但还没有调用 .start() 方法在系统中创建线程。
2、TERMINATED Thread对象仍然存在,但是内部的线程已经执行完毕了。
3、RUNNABLE 就绪状态,表示这个线程正在cup上执行,或者准备就绪随时可以在c pu上执行。
4、TIMED_WAITING 指定时间的阻塞,到达一定时间后就会解除阻塞。
(如: 使用sleep和带有超时时间的join也会进入这个状态)
5、WAITING 不带时间的阻塞(死等),必须满足一定的条件,才会解除。
(如: join和wait)
6、BLOCKED 由于锁竞争,引起的阻塞。
图关系如下:
代码如下:
⭐线程安全
这里是很重要的知识点,必须要认真学习,多加思考理解。
线程的概念:
如果多线程环境下代码运行的结果是符合我们预期的,即在单线程环境下也是这样的结果,则说这个程序是线程安全的。
例子:
我们创建两个线程来计算count累加到10_0000的结果,看看是否会符合我们的预期。
单线程下会得到正确的答案:
多线程下就不会得到正确的答案:
因为线程的调度是随机的,我们如果不加限定的条件,线程就可能不安全,很难达到我们预期的结果。