Java多线程之同步通信

时间:2021-01-10 18:28:49

      今天做了一个Demo,主要功能是:主线程执行10次,然后子线程执行10次,再然后主线程执行10次,如此循环50次。

      设计思路:

      1、先实现两个线程的互斥。

         这里会用到锁来同步代码的执行。初步设计是在两个线程中都使用一把锁来控制业务代码的执行。

public class test1 {
public static void main(String[] args){

new Thread(new Runnable(){

@Override
public void run() {
synchronized(test1.class){
for(int i=1;i<=50;i++){
for(int j=0;j<=10;j++){
System.out.println("sub thread sequece of "+j+", loop of"+i);
}
}
}
}
}).start();
synchronized(test1.class){
for(int i=1;i<=50;i++){
for(int j=0;j<=10;j++){
System.out.println("main thread sequece of "+j+", loop of"+i);
}
}
}

}

}

结果输出是互斥的:

Java多线程之同步通信

      

      2、封装临界代码,把代码的同步控制在一个类中。上面例子中的代码同步散落在业务逻辑中,现在我们要做的就是去封装它。

    

public class test1 {
public static void main(String[] args){
final Business business=new Business();
new Thread(new Runnable(){

@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub(i);
}
}
}).start();
for(int i=1;i<=50;i++){
business.main(i);
}

}

}
class Business{

public synchronized void sub(int i){

}

public synchronized void main(int i){

}
}
       3、上面的封装其实是一种思想,就是把技术层面的东西封装成工具,让开发者更多地去关于业务,而不需要太多在技术实现上投入大多精力。那么如何实现线程之间的通信呢,模型大概是这样的:main线程和sub线程共同判断一个boolean变量,看看该谁执行了。从main线程开始执行,执行完了,把共享的Boolean取反,然后通知sub线程开始执行。如此循环便可以了。

    

public class TraditionalThreadCommunication {
public static void main(String[] args){
final Business business=new Business();
new Thread(new Runnable(){

@Override
public void run() {
for(int i=1;i<=50;i++){
business.sub(i);
}
}

}).start();

for(int i=1;i<=50;i++){
business.main(i);
}
}

}
class Business{
private boolean bShouldSub=true;

public synchronized void sub(int i){
while(!bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int j=0;j<=10;j++){
System.out.println("sub thread sequece of "+j+", loop of"+i);
}
bShouldSub=false;
this.notify();
}

public synchronized void main(int i){
while(bShouldSub){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

for(int j=0;j<=10;j++){
System.out.println("main thread sequece of "+j+", loop of"+i);
}
bShouldSub=true;
this.notify();
}
}

总结:多线程中有很多java的精华思想,需要我们去学习。要成为一名优秀的程序员,这些基础知识必须要掌握。