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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ringfingers 中级黑马   /  2015-10-7 21:34  /  414 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



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

//第二题是  创建两个线程交替输出 1-10所有的数字
public class ThreadTest {
        
        private static int count = 0;
        
        private static Lock lock = new ReentrantLock();//新建一个锁对象
        private static Condition con = lock.newCondition();//获取一个 与锁绑定的condition对象
        private static boolean flag = false;//用于线程间通信
        
        //每调用一次函数输出count一次,输出后count加1
        public static void out() {// 多个线程或调用这个函数,所以需要就其进行同步
                if (count <= 10) {
                        System.out
                                        .println(count++ + "..." + Thread.currentThread().getName());
                }
        }

        public static void main(String[] args) throws Exception{
                new Thread(new Runnable() {
                        public void run() {
                                for (int i = 0; i < 5; i++) {//因为要输出10次,所以每个线程只需要调用5次 out()函数
//                                        synchronized(lock){
                                        lock.lock();//从这里锁定,只允许一个线程进入
                                                while (flag)//内部类访问局部变量时,变量必须是常量,所以把flag定义在类里
                                                        try {
//                                                                lock.wait();
                                                                con.await();
                                                        } catch (InterruptedException e) {
                                                                e.printStackTrace();
                                                        }
                                                out();
                                                flag = true;
//                                                lock.notifyAll();
                                                con.signalAll();
                                                lock.unlock();//解锁
                                        }
//                                }
                        }
                }).start();
                new Thread(new Runnable() {
                        public void run() {
                                for (int i = 0; i < 5; i++) {//因为要输出10次,所以每个线程只需要调用5次 out()函数
//                                        synchronized(lock){
                                        lock.lock();//从这里锁定,只允许一个线程进入
                                                while (!flag)//内部类访问局部变量时,变量必须是常量,所以把flag定义在类里
                                                        try {
//                                                                lock.wait();
                                                                con.await();
                                                        } catch (InterruptedException e) {
                                                                e.printStackTrace();
                                                        }
                                                out();
                                                flag = false;
//                                                lock.notifyAll();
                                                con.signalAll();
                                                lock.unlock();//解锁
                                        }
//                                }
                        }
                }).start();
        }
}

1 个回复

倒序浏览
0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马