前记
上一篇温习的是java中传统线程互斥,这次来温习java中传统的线程的同步与通信
场景及代码
子线程循环12次,接着主线程循环88,接着又回到子线程循环12次,接着再回到主线程又循环88,如此循环50次.
思路如下
/**
* 思路:
* 首先实现内层子线程循环12次,主线程循环88次,外层都是50次
* 发现要把两个内层循环的内容添加互斥,不然的话会互相打断
* 接下来发现两个线程现在是没有互相打断了,但是并没有相互通信
* =====这里我们将这两个需要互斥的子块抽离出来方便维护和管理
* 下面就加标识并且利用wait()和notify()让两个线程进行交互
* 这里判断是不是轮到当前线程执行使用while循环
* 因为if()判断有可能出现implicit weak up 假唤醒
* 当不该当前线程执行时就让当前线程阻塞,该当前线程执行的时候
* 执行完当前业务还要唤醒阻塞的线程,并且把标识重置
*/
代码如下
package com.thread.test;
/*********************************************************************************
//* Copyright (C) 2015 Pingan Haoche (PAHAOCHE). All Rights Reserved.
//*
//* Filename: ThreadSynchronizedTest.java
//* Revision: 1.0
//* Author: <gao yunqi>
//* Created On: 2016年2月22日
//* Modified by:
//* Modified On:
//*
//* Description: <子线程循环12次,接着主线程循环88,接着又回到子线程循环12次,接着再回到主线程又循环88,如此循环50次.>
/********************************************************************************/
public class TraditionalThreadCommunication {
private static final Operate operate = new Operate();
/**
* @param args
*/
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 50; i++) {
operate.doSubMethod(i);
}
}
}).start();
for (int i = 1; i <= 50; i++) {
operate.doMainMethod(i);
}
}
}
class Operate{
boolean isSub = true;//默认从子线程开始执行
/**
* 子线程执行业务
* @param i
*/
public synchronized void doSubMethod(int i){
while(!isSub){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 12; j++) {
System.out.println("子线程 " + Thread.currentThread().getName() + "\tloop:" + i + "\t第" + j + "次");
}
isSub = false;
notify();
}
/**
* 主线程执行业务
* @param i
*/
public synchronized void doMainMethod(int i){
while(isSub){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int j = 1; j <= 88; j++) {
System.out.println("主线程 " + Thread.currentThread().getName() + "\tloop:" + i + "\t第" + j + "次");
}
isSub = true;
notify();
}
}
以上便是传统线程同步与通信的相关内容