当前位置: 代码迷 >> Java相关 >> 一个线程加一演算,一个线程做减一运算,多个线程同时交替运行-synchronized
  详细解决方案

一个线程加一演算,一个线程做减一运算,多个线程同时交替运行-synchronized

热度:480   发布时间:2016-04-22 19:41:43.0
一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized

使用synchronized

 

 

package com.pb.thread.demo5;/**使用synchronized * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行 *  * @author Denny * */public class Count {    private int num = 0;    private boolean flag = false; // 标识    //加法    public synchronized void add() {        while (flag) {            try {                wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        this.num++; //        System.out.println(Thread.currentThread().getName() + "........" + this.num);        this.flag=true; //设置标识为true        notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒            }    //减法    public synchronized void sub() {        while (!flag) {            try {                wait();            } catch (InterruptedException e) {                e.printStackTrace();            }        }        this.num--; //        System.out.println(Thread.currentThread().getName() + "........" + this.num);        this.flag=false; //设置标识为true        notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒    }}

 

 

 

 

package com.pb.thread.demo5;public class Add implements Runnable {    private Count count;    public Add(Count count){        this.count=count;    }     @Override    public void run() {        while(true){            count.add();        }    }}//================package com.pb.thread.demo5;public class Sub implements Runnable {    private Count count;    public Sub(Count count){        this.count=count;    }     @Override    public void run() {        while(true){            count.sub();        }    }} 

 

测试类

 

package com.pb.thread.demo5;public class CountTest {    public static void main(String[] args) {        Count c=new Count();        Add add=new Add(c);        Sub sub=new Sub(c);        Thread t1=new Thread(add);        Thread t2=new Thread(add);        Thread t3=new Thread(sub);        Thread t4=new Thread(sub);        t1.start();        t2.start();        t3.start();        t4.start();    }}

 

结果:

 
Thread-2........0Thread-1........1Thread-3........0Thread-0........1Thread-2........0Thread-1........1Thread-3........0Thread-0........1Thread-2........0
 

不使用synchronized

package com.pb.thread.demo4;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行 * @author Denny * */public class Count {    private int num = 0;    private boolean flag=false; // 标识    Lock lock = new ReentrantLock(); //    Condition add = lock.newCondition(); // 加法锁    Condition sub = lock.newCondition();// 减法锁    public void add() {        lock.lock();// 锁上        try {            while (flag) {  //循环判断                add.await();            }            this.num++;            System.out.println(Thread.currentThread().getName() + "........" + this.num);            this.flag = true; // 设置标识            sub.signal(); // 唤醒指定线程        } catch (InterruptedException e) {            e.printStackTrace();        }finally{            lock.unlock();        }            }    public void sub() {        lock.lock();// 锁上        try {            while (!flag) {//循环判断                sub.await();            }            this.num--;            System.out.println(Thread.currentThread().getName() + "........" + this.num);            this.flag = false; // 设置标识            add.signal(); // 唤醒指定线程        } catch (InterruptedException e) {            e.printStackTrace();        }finally{            lock.unlock();        }            }}

 

 

 

package com.pb.thread.demo4;public class Add implements Runnable {    private Count count;    public Add(Count count){        this.count=count;    }     @Override    public void run() {        while(true){            count.add();        }    }}

 

 

package com.pb.thread.demo4;public class Sub implements Runnable {    private Count count;    public Sub(Count count){        this.count=count;    }     @Override    public void run() {        while(true){            count.sub();        }    }}

 

 

package com.pb.thread.demo4;public class CountTest {    public static void main(String[] args) {        Count c=new Count();        Add add=new Add(c);                Sub sub=new Sub(c);        Thread t1=new Thread(add);        Thread t2=new Thread(add);        Thread t3=new Thread(sub);        Thread t4=new Thread(sub);        t1.start();        t2.start();        t3.start();        t4.start();    }}

 

结果:

 
Thread-1........1Thread-3........0Thread-0........1Thread-2........0Thread-1........1Thread-3........0Thread-0........1Thread-2........0
 

 

  相关解决方案