多线程_线程同步小程序

来源:互联网 发布:苹果mac 镜像下载 编辑:程序博客网 时间:2024/05/17 15:42


1:需求:子线程执行10次,主线程执行100次,再子线程10次,主线程100次,如此的往复50次。 

2为了方便看结果,先把次数改成10次,10次,10次。 

3总结:

  互斥:同一块代码的原子性操作,不容其它代码打乱 

  同步:不同代码块之间,在互斥的基础上,按照顺序执行 对于互斥和同步的代码块,应该使用业务类来处理,要独立于线程类,再让线程类来调用业务类,实现需求。

代码:

public class TraditionalThreadCommunication {public static void main(String[] args) {       final Business business=new Business();       new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 10; i++) {business.sub(i);}}}).start();for (int i = 0; i < 10; i++) {business.main(i);}}}/* * 更面向对象:将线程执行的任务逻辑放到一个业务类里面,<br>  * 在业务类中控制他们的互斥和同步<br> *  ①使用synchronized进行互斥,说到底就是同一代码的原子性,不可再分。<br> *  ②使用一个变量bShouldSub进行同步,说到底就是不同代码的执行顺序。<br> */class Business {boolean bShouldSub = true;public synchronized void sub(int i) {//当代码进来后,线程发现不该自己运行(逆向思维),于是等待,并唤醒其他线程/* * 有时候线程是伪唤醒:即其他线程还在执行,这个线程就醒了,也要执行,就会 *  打乱其他线程的执行。这时,要继续判断一下这个线程是否满足执行条件,使用while即可。 */while (!bShouldSub) {try {this.wait(); //线程等待:即代码中断} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}        //当该自己走,走完后,将bShuouldSub置false,并唤醒其他线程for (int j = 0; j < 10; j++) {System.out.println("sub thread sequence of " + j + ",loop of" + i);}bShouldSub=false;this.notify();//由于另一个线程可能进入了wait,需要唤醒}public synchronized void main(int i) {//当代码进来后,线程发现不该自己运行(逆向思维),于是等待,并唤醒其他线程while (bShouldSub) { try {this.wait(); //线程等待:即代码中断} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//当该自己走,走完后,将bShuouldSub置true,并唤醒其他线程for (int j = 0; j < 10; j++) {System.out.println("main thread sequence of " + j + ",loop of" + i);}bShouldSub=true;this.notify();//由于另一个线程可能进入了wait,需要唤醒}}