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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fmi110 高级黑马   /  2015-10-4 23:20  /  190 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

a


  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;

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

  20.         public static void main(String[] args) throws Exception{
  21.                 new Thread(new Runnable() {
  22.                         public void run() {
  23.                                 for (int i = 0; i < 5; i++) {//因为要输出10次,所以每个线程只需要调用5次 out()函数
  24. //                                        synchronized(lock){
  25.                                         lock.lock();//从这里锁定,只允许一个线程进入
  26.                                                 while (flag)//内部类访问局部变量时,变量必须是常量,所以把flag定义在类里
  27.                                                         try {
  28. //                                                                lock.wait();
  29.                                                                 con.await();
  30.                                                         } catch (InterruptedException e) {
  31.                                                                 e.printStackTrace();
  32.                                                         }
  33.                                                 out();
  34.                                                 flag = true;
  35. //                                                lock.notifyAll();
  36.                                                 con.signalAll();
  37.                                                 lock.unlock();//解锁
  38.                                         }
  39. //                                }
  40.                         }
  41.                 }).start();
  42.                 new Thread(new Runnable() {
  43.                         public void run() {
  44.                                 for (int i = 0; i < 5; i++) {//因为要输出10次,所以每个线程只需要调用5次 out()函数
  45. //                                        synchronized(lock){
  46.                                         lock.lock();//从这里锁定,只允许一个线程进入
  47.                                                 while (!flag)//内部类访问局部变量时,变量必须是常量,所以把flag定义在类里
  48.                                                         try {
  49. //                                                                lock.wait();
  50.                                                                 con.await();
  51.                                                         } catch (InterruptedException e) {
  52.                                                                 e.printStackTrace();
  53.                                                         }
  54.                                                 out();
  55.                                                 flag = false;
  56. //                                                lock.notifyAll();
  57.                                                 con.signalAll();
  58.                                                 lock.unlock();//解锁
  59.                                         }
  60. //                                }
  61.                         }
  62.                 }).start();
  63.         }
  64. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马