highlight: androidstudio
先来张线程状态图热热身
join
可以保证线程的执行顺序
现在有两个线程如下: ```java private static void testJoin() { Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("A" + i); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); new Thread(() -> {
for (int i = 0; i < 10; i++) { System.out.println("B" + i); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } ```
运行方法看下输出:
java A0 B0 A1 B1 A2 B2 A3 B3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 A9 B9
- 当在线程A中调用线程B.join()时候 (线程A将会让出cpu,给线程B)如下
```java private static void testJoin() throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("A" + i); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }); t1.start(); new Thread(() -> { try { //在本线程内,等待t1线程执行完毕再执行本线程,如果在main线程中t1.join,那就是main线程让出cpu,给t1执行 t1.join(); } catch (InterruptedException e) { e.printStackTrace(); }
for (int i = 0; i < 10; i++) {
System.out.println("B" + i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); } ```
java A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9
sleep用的比较多
- 尤其是查询接口sleep一下 (为后续优化埋下伏笔) ,老板估计会给你加钱哈,当然搞不好也会last day 哈哈~~~
- 注意sleep是拿这锁去sleep,其他线程会阻塞哦 代码不贴了没啥说的
yield
- 就是当前线程正在执行的时候停止下来进入等待队列(就绪状态,CPU依然有可能把这个线程拿出来运行), 当然,更大的可能性是把原来等待的那些拿出一个来执行,所以yield的意思是我让出一下CPU,后面你们能不能抢 到那我不管 so 给他起个名词叫做
礼让
出于礼貌让一下,后续我可能还会和你抢!!!
```java static void testYield() { new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("A" + i); Thread.yield();
}
}).start();
new Thread(() -> { for (int i = 0; i < 10; i++) { System.out.println("------------B" + i); } }).start(); } ```
不礼让
礼让
当然该测试存在一定的歧义(因为数据很少)。不过当数据量大实话,我相信礼让的效果会更明显也更有说服力。(也就是说B抢到的cpu次数会更多些)