Skip to content

Commit cebf798

Browse files
committed
java-multithread lock包更新至example9
1 parent 869156c commit cebf798

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1598
-0
lines changed
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.brianway.learning.java.multithread.lock.example2;
2+
3+
4+
import java.util.concurrent.locks.Condition;
5+
import java.util.concurrent.locks.Lock;
6+
import java.util.concurrent.locks.ReentrantLock;
7+
8+
/**
9+
* Created by brian on 2016/4/15.
10+
*/
11+
public class MyService {
12+
private Lock lock = new ReentrantLock();
13+
private Condition conditionA = lock.newCondition();
14+
private Condition conditionB = lock.newCondition();
15+
16+
public void awaitA(){
17+
try {
18+
lock.lock();
19+
System.out.println("awaitA begin时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
20+
conditionA.await();
21+
System.out.println("awaitA end 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
22+
} catch (InterruptedException e) {
23+
e.printStackTrace();
24+
}finally {
25+
lock.unlock();
26+
System.out.println("A锁释放了 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
27+
}
28+
}
29+
30+
public void awaitB(){
31+
try {
32+
lock.lock();
33+
System.out.println("awaitB begin时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
34+
conditionB.await();
35+
System.out.println("awaitB end 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
36+
} catch (InterruptedException e) {
37+
e.printStackTrace();
38+
}finally {
39+
lock.unlock();
40+
System.out.println("B锁释放了 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
41+
}
42+
}
43+
44+
public void signalAll_A(){
45+
try {
46+
lock.lock();
47+
System.out.println("signalAll_A 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
48+
conditionA.signalAll();
49+
} finally {
50+
lock.unlock();
51+
}
52+
}
53+
54+
public void signalAll_B(){
55+
try {
56+
lock.lock();
57+
System.out.println("signalAll_B 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
58+
conditionB.signalAll();
59+
} finally {
60+
lock.unlock();
61+
}
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.brianway.learning.java.multithread.lock.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/15.
5+
*/
6+
7+
/**
8+
* P210
9+
* 使用多个condition实现通知部分线程
10+
*/
11+
public class Run2_MustUseMoreCondition {
12+
public static void main(String[] args) throws InterruptedException {
13+
MyService service = new MyService();
14+
ThreadA a = new ThreadA(service);
15+
a.setName("A");
16+
a.start();
17+
ThreadB b = new ThreadB(service);
18+
b.setName("B");
19+
b.start();
20+
Thread.sleep(3000);
21+
service.signalAll_A();
22+
}
23+
}
24+
25+
26+
/*
27+
输出:
28+
awaitA begin时间为1460687242048 ThreadName=A
29+
awaitB begin时间为1460687242048 ThreadName=B
30+
signalAll_A 时间为1460687245048 ThreadName=main
31+
awaitA end 时间为1460687245048 ThreadName=A
32+
A锁释放了 时间为1460687245048 ThreadName=A
33+
*/
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.brianway.learning.java.multithread.lock.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/15.
5+
*/
6+
public class ThreadA extends Thread{
7+
private MyService service;
8+
9+
public ThreadA(MyService service) {
10+
this.service = service;
11+
}
12+
13+
@Override
14+
public void run() {
15+
service.awaitA();
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.brianway.learning.java.multithread.lock.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/15.
5+
*/
6+
public class ThreadB extends Thread{
7+
private MyService service;
8+
9+
public ThreadB(MyService service) {
10+
this.service = service;
11+
}
12+
13+
@Override
14+
public void run() {
15+
service.awaitB();
16+
}
17+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.brianway.learning.java.multithread.lock.example3;
2+
3+
import java.util.concurrent.locks.Condition;
4+
import java.util.concurrent.locks.ReentrantLock;
5+
6+
/**
7+
* Created by Brian on 2016/4/15.
8+
*/
9+
public class MyService {
10+
private ReentrantLock lock = new ReentrantLock();
11+
private Condition condition = lock.newCondition();
12+
private boolean hasValue = false;
13+
14+
15+
public void set(){
16+
try {
17+
lock.lock();
18+
while (hasValue == true){
19+
System.out.println("有可能★★连续"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
20+
condition.await();
21+
}
22+
System.out.println("打印★"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
23+
hasValue = true;
24+
//condition.signal();
25+
condition.signalAll();
26+
} catch (InterruptedException e) {
27+
e.printStackTrace();
28+
} finally {
29+
System.out.println("set unlock"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
30+
lock.unlock();
31+
}
32+
}
33+
34+
35+
public void get(){
36+
try {
37+
lock.lock();
38+
while (hasValue == false){
39+
System.out.println("有可能☆☆连续"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
40+
condition.await();
41+
}
42+
System.out.println("打印☆"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
43+
hasValue = false;
44+
//condition.signal();
45+
condition.signalAll();
46+
} catch (InterruptedException e) {
47+
e.printStackTrace();
48+
} finally {
49+
System.out.println("get unlock"+" 时间为"+System.currentTimeMillis()+" ThreadName="+Thread.currentThread().getName());
50+
lock.unlock();
51+
}
52+
}
53+
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package com.brianway.learning.java.multithread.lock.example3;
2+
3+
/**
4+
* Created by Brian on 2016/4/15.
5+
*/
6+
7+
/**
8+
* P215
9+
* 实现生产者/消费者模式,多对多交替打印
10+
* signal()会假死
11+
* signalAll()
12+
*/
13+
public class Run3_ConditionManyToMany {
14+
public static void main(String[] args) {
15+
MyService service = new MyService();
16+
ThreadA[] threadAs = new ThreadA[10];
17+
ThreadB[] threadBs = new ThreadB[10];
18+
for(int i=0;i<10;i++){
19+
threadAs[i] = new ThreadA(service);
20+
threadBs[i] = new ThreadB(service);
21+
threadAs[i].start();
22+
threadBs[i].start();
23+
}
24+
}
25+
}
26+
27+
28+
/*
29+
输出:
30+
有可能★★连续 时间为1460688833773 ThreadName=Thread-18
31+
有可能★★连续 时间为1460688833773 ThreadName=Thread-2
32+
有可能★★连续 时间为1460688833773 ThreadName=Thread-10
33+
有可能★★连续 时间为1460688833773 ThreadName=Thread-4
34+
有可能★★连续 时间为1460688833773 ThreadName=Thread-8
35+
有可能★★连续 时间为1460688833773 ThreadName=Thread-0
36+
打印☆ 时间为1460688833773 ThreadName=Thread-13
37+
get unlock 时间为1460688833773 ThreadName=Thread-13
38+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-13
39+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-7
40+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-9
41+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-11
42+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-1
43+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-5
44+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-15
45+
打印★ 时间为1460688833773 ThreadName=Thread-6
46+
set unlock 时间为1460688833773 ThreadName=Thread-6
47+
有可能★★连续 时间为1460688833773 ThreadName=Thread-6
48+
有可能★★连续 时间为1460688833773 ThreadName=Thread-12
49+
有可能★★连续 时间为1460688833773 ThreadName=Thread-16
50+
有可能★★连续 时间为1460688833773 ThreadName=Thread-14
51+
打印☆ 时间为1460688833773 ThreadName=Thread-17
52+
get unlock 时间为1460688833773 ThreadName=Thread-17
53+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-17
54+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-3
55+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-19
56+
打印★ 时间为1460688833773 ThreadName=Thread-18
57+
set unlock 时间为1460688833773 ThreadName=Thread-18
58+
有可能★★连续 时间为1460688833773 ThreadName=Thread-18
59+
有可能★★连续 时间为1460688833773 ThreadName=Thread-2
60+
有可能★★连续 时间为1460688833773 ThreadName=Thread-10
61+
有可能★★连续 时间为1460688833773 ThreadName=Thread-4
62+
有可能★★连续 时间为1460688833773 ThreadName=Thread-8
63+
有可能★★连续 时间为1460688833773 ThreadName=Thread-0
64+
打印☆ 时间为1460688833773 ThreadName=Thread-13
65+
get unlock 时间为1460688833773 ThreadName=Thread-13
66+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-13
67+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-7
68+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-9
69+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-11
70+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-1
71+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-5
72+
有可能☆☆连续 时间为1460688833773 ThreadName=Thread-15
73+
打印★ 时间为1460688833773 ThreadName=Thread-6
74+
set unlock 时间为1460688833773 ThreadName=Thread-6
75+
有可能★★连续 时间为1460688833773 ThreadName=Thread-6
76+
有可能★★连续 时间为1460688833773 ThreadName=Thread-12
77+
有可能★★连续 时间为1460688833773 ThreadName=Thread-16
78+
有可能★★连续 时间为1460688833773 ThreadName=Thread-14
79+
打印☆ 时间为1460688833773 ThreadName=Thread-17
80+
get unlock 时间为1460688833773 ThreadName=Thread-17
81+
*/
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.brianway.learning.java.multithread.lock.example3;
2+
3+
4+
5+
/**
6+
* Created by Brian on 2016/4/15.
7+
*/
8+
public class ThreadA extends Thread{
9+
private MyService service;
10+
11+
public ThreadA(MyService service) {
12+
this.service = service;
13+
}
14+
15+
@Override
16+
public void run() {
17+
for(int i = 0;i<Integer.MAX_VALUE;i++){
18+
service.set();
19+
}
20+
}
21+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.brianway.learning.java.multithread.lock.example3;
2+
3+
4+
5+
/**
6+
* Created by Brian on 2016/4/15.
7+
*/
8+
public class ThreadB extends Thread{
9+
private MyService service;
10+
11+
public ThreadB(MyService service) {
12+
this.service = service;
13+
}
14+
15+
@Override
16+
public void run() {
17+
for(int i = 0;i<Integer.MAX_VALUE;i++){
18+
service.get();
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)