软件设计 2017-03-25
1 package TestThread.TestCondition;
2
3 import java.util.concurrent.locks.ReentrantLock;
4 import java.util.concurrent.locks.*;
5
6 public class TestCondition {
7 public static void main(String[] args) {
8 ReentrantLock lock = new ReentrantLock();
9 Condition condition = lock.newCondition();
10 Test1 th1 = new Test1(lock, condition, "线程1");
11 Test1 th2 = new Test1(lock, condition, "线程2");
12 Test1 th3 = new Test1(lock, condition, "线程3");
13 Test2 t2 = new Test2(condition, lock, "我是唤醒线程");
14 th1.start();
15 th2.start();
16 th3.start();
17 try {
18 Thread.sleep(1000);
19 t2.start();
20 } catch (InterruptedException e) {
21 e.printStackTrace();
22 }
23 }
24 }
25
26 class Test1 extends Thread {
27 private ReentrantLock lock;
28 private Condition condition1;
29
30 public Test1(ReentrantLock lock, Condition condition1, String name) {
31 super(name);
32 this.lock = lock;
33 this.condition1 = condition1;
34 }
35
36 @Override
37 public void run() {
38 for (int i = 0; i < 10; i++) {
39 try {
40 lock.lock();// 加锁
41 if (i == 5) {
42 try {
43 condition1.await();
44 System.out.println(Thread.currentThread().getName() + "当前线程获取到的值为:++++++++++++" + i);
45 } catch (InterruptedException e) {
46 System.out.println(Thread.currentThread().getName() + ":线程被中断了!");
47 }
48 } else {
49 System.out.println(Thread.currentThread().getName() + ":当前线程获取到的值为===》" + i);
50 }
51 } catch (Exception e) {
52 System.out.println("系统发生异常!");
53 } finally {
54 lock.unlock();// 解锁
55 }
56 }
57 }
58 }
59
60 class Test2 extends Thread {
61 private Condition condition;
62 public ReentrantLock lock;
63
64 /**
65 * @param condition协作对象
66 * @param lock锁对象
67 * @param name线程名称
68 */
69 public Test2(Condition condition, ReentrantLock lock, String name) {
70 super(name);
71 this.condition = condition;
72 this.lock = lock;
73 }
74
75 @Override
76 public void run() {
77 try {
78 lock.lock();// 加锁
79 condition.signalAll();;// 唤醒启动全部线程
80 System.out.println(Thread.currentThread().getName() + ":已经唤醒了一个线程!");
81 } catch (Exception e) {
82 System.out.println(Thread.currentThread().getName() + ":线程挂了!");
83 } finally {
84 lock.unlock();// 解锁
85 }
86 }
87 }测试结果: