A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘旭 黑马帝   /  2012-3-27 15:07  /  1752 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘旭 于 2012-3-27 15:08 编辑

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class TraditionalThreadCommunication {
        public static void main(String[] args) {
                final Business business = new Business();
                new Thread(new Runnable() {
                        public void run() {
                                for (int i = 1; i <= 50; i++) {
                                       
                                        business.thread1(i);System.out.println("1");
                                }
                        }
                }).start();
                new Thread(new Runnable() {
                        public void run() {
                                for (int i = 1; i <= 50; i++) {
                                        business.thread2(i);System.out.println("2");
                                }
                        }
                }).start();
                new Thread(new Runnable() {
                        public void run() {
                                for (int i = 1; i <= 50; i++) {
                                        business.thread3(i);System.out.println("3");
                                }
                        }
                }).start();
        }
}

// 封装资源
class Business {
        Lock lock = new ReentrantLock();
        Condition key1 = lock.newCondition();
        Condition key2 = lock.newCondition();
        Condition key3 = lock.newCondition();
        int beShould = 1;

        public synchronized void thread1(int i) {
                lock.lock();
                        while (beShould != 1) {
                                try {
                                        key1.await();
                                } catch (Exception e) {
                                }
                        }
                        for (int j = 1; j <= 5; j++) {
                                System.out.println("thread1 thread : " + j + ",loop: " + i);
                        }
                        beShould = 2;
                        key2.signal();System.out.println("Test");
                lock.unlock();

        }

        public synchronized void thread2(int i) {
                lock.lock();
                        while (beShould != 2) {
                                try {
                                        key2.await();
                                } catch (Exception e) {
                                }
                        }
                        for (int j = 1; j <= 10; j++) {
                                System.out.println("thread2 thread: " + j + ",loop: " + i);
       
                        }
                        beShould = 3;
                        key3.signal();
                       
                lock.unlock();
        }

        public synchronized void thread3(int i) {
                lock.lock();
                        while (beShould != 3) {
                                try {
                                        key3.await();
                                } catch (Exception e) {
                                }
                        }
                        for (int j = 1; j <= 15; j++) {
                                System.out.println("thread3 thread: " + j + ",loop: " + i);
                        }
                        beShould = 1;
                        key1.signal();
                lock.unlock();
        }
}

线程1循环5次,线程2循环10次,线程3循环20次。如此重复50次。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

1 个回复

倒序浏览
找到问题了,改写前面的程序时,忘记去掉synchronized了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马