java线程技术分享,java多线程技术点( 六 )


CyclicBarrier的计数器更像一个阀门 , 需要所有线程都到达 , 然后继续执行,计数器递增,提供Reset功能 , 可以多次使用 。
3. 多线程间通信的几种方式
提及多线程又不得不提及多线程通信的机制 。首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的 。我们来基本一道面试常见的题目来分析:
题目:有两个线程A、B,A线程向一个集合里面依次添加元素"abc"字符串,一共添加十次,当添加到第五次的时候,希望B线程能够收到A线程的通知 , 然后B线程执行相关的业务操作 。
3.1使用volatile关键字
package thread;
/**
*
* @author hxz
* @description 多线程测试类
* @version 1.0
* @data 2020年2月15日 上午9:10:09
*/
public class MyThreadTest {
public static void main(String[] args) throws Exception {
notifyThreadWithVolatile;
}
/**
* 定义一个测试
*/
private static volatile boolean flag = false;
/**
* 计算I++ , 当I==5时,通知线程B
* @throws Exception
*/
private static void notifyThreadWithVolatile throws Exception {
Thread thc = new Thread("线程A"){
@Override
public void run {
for (int i = 0; i < 10; i++) {
if (i == 5) {
flag = true;
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace;
}
break;
}
System.out.println(Thread.currentThread.getName + "====" + i);
}
}
};
Thread thd = new Thread("线程B") {
@Override
public void run {
while (true) {
// 防止伪唤醒 所以使用了while
while (flag) {
System.out.println(Thread.currentThread.getName + "收到通知");
System.out.println("do something");
try {
Thread.sleep(500L);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace;
}
return ;
}
}
}
};
thd.start;
Thread.sleep(1000L);
thc.start;
}
}
个人认为这是基本上最好的通信方式 , 因为A发出通知B能够立马接受并Do Something 。
【java线程技术分享,java多线程技术点】原文链接:
***/weixin_44104367/article/details/104481510


推荐阅读