Skip to content

Commit 82ac4cf

Browse files
committed
java-multihread 添加communication包,更新至example2
1 parent 31c43f3 commit 82ac4cf

File tree

10 files changed

+375
-0
lines changed

10 files changed

+375
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.brianway.learning.java.multithread.communication.example1;
2+
3+
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
/**
8+
* Created by Brian on 2016/4/13.
9+
*/
10+
public class MyList {
11+
private List list = new ArrayList();
12+
13+
public void add(){
14+
list.add("brian");
15+
}
16+
public int size(){
17+
return list.size();
18+
}
19+
}
20+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.brianway.learning.java.multithread.communication.example1;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
7+
/**
8+
* P134
9+
* 不使用等待/通知机制实现线程间通信
10+
*
11+
* 这里有可见性的问题,并不一定能看到线程b退出。
12+
*/
13+
public class Run1_TwoThreadTransData {
14+
public static void main(String[] args) {
15+
MyList service = new MyList();
16+
ThreadA a =new ThreadA(service);
17+
a.setName("A");
18+
a.start();
19+
ThreadB b = new ThreadB(service);
20+
b.setName("B");
21+
b.start();
22+
}
23+
24+
}
25+
26+
27+
/*
28+
在ThreadB的run方法while里加上synchronized ("any"){}
29+
30+
输出:
31+
添加了1元素
32+
添加了2元素
33+
添加了3元素
34+
添加了4元素
35+
java.lang.InterruptedException
36+
at com.brianway.learning.java.multithread.communication.example1.ThreadB.run(ThreadB.java:22)
37+
添加了5元素
38+
达到size了,线程b要退出了
39+
添加了6元素
40+
添加了7元素
41+
添加了8元素
42+
添加了9元素
43+
添加了10元素
44+
45+
46+
----------------
47+
若不加synchronized ("any"){}
48+
49+
输出:
50+
添加了1元素
51+
添加了2元素
52+
添加了3元素
53+
添加了4元素
54+
添加了5元素
55+
添加了6元素
56+
添加了7元素
57+
添加了8元素
58+
添加了9元素
59+
添加了10元素
60+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.brianway.learning.java.multithread.communication.example1;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
public class ThreadA extends Thread {
7+
private MyList list;
8+
9+
public ThreadA(MyList list) {
10+
super();
11+
this.list = list;
12+
}
13+
14+
@Override
15+
public void run() {
16+
for(int i = 0;i<10;i++){
17+
list.add();
18+
System.out.println("添加了"+(i+1)+"元素");
19+
try {
20+
Thread.sleep(1000);
21+
} catch (InterruptedException e) {
22+
e.printStackTrace();
23+
}
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.brianway.learning.java.multithread.communication.example1;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
public class ThreadB extends Thread {
7+
private MyList list;
8+
9+
public ThreadB(MyList list) {
10+
super();
11+
this.list = list;
12+
}
13+
14+
@Override
15+
public void run() {
16+
try {
17+
while (true){
18+
//System.out.println("in b while: "+list.size());
19+
//synchronized ("any"){}
20+
if(list.size() == 5){
21+
System.out.println("达到size了,线程b要退出了");
22+
throw new InterruptedException();
23+
}
24+
}
25+
} catch (InterruptedException e) {
26+
e.printStackTrace();
27+
}
28+
}
29+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.brianway.learning.java.multithread.communication.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
7+
/**
8+
* P137
9+
* 没有“对象监视器”,调用wait()方法出现运行时异常
10+
*/
11+
public class Run2_noObjectLock {
12+
public static void main(String[] args) {
13+
String s = new String("");
14+
try {
15+
s.wait();
16+
} catch (InterruptedException e) {
17+
e.printStackTrace();
18+
}
19+
}
20+
}
21+
22+
/*
23+
输出:
24+
Exception in thread "main" java.lang.IllegalMonitorStateException
25+
at java.lang.Object.wait(Native Method)
26+
at java.lang.Object.wait(Object.java:502)
27+
at com.brianway.learning.java.multithread.communication.example2.Run2_noObjectLock.main(Run2_noObjectLock.java:15)
28+
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
29+
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
30+
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
31+
at java.lang.reflect.Method.invoke(Method.java:483)
32+
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
33+
34+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.brianway.learning.java.multithread.communication.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
7+
/**
8+
* P139
9+
* notify实现通知
10+
* notify调用后,并不会立即释放对象锁,而是退出synchronized代码块后
11+
*/
12+
public class Run2_notify {
13+
public static void main(String[] args) {
14+
try {
15+
Object lock = new Object();
16+
Thread1 t1 = new Thread1(lock);
17+
t1.start();
18+
Thread.sleep(3000);
19+
Thread2 t2 = new Thread2(lock);
20+
t2.start();
21+
} catch (InterruptedException e) {
22+
e.printStackTrace();
23+
}
24+
25+
}
26+
}
27+
28+
29+
/*
30+
输出:
31+
开始 wait time=1460554213416
32+
开始 notify time=1460554216418
33+
结束 notify time=1460554218418
34+
结束 wait time=1460554218418
35+
36+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.brianway.learning.java.multithread.communication.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
7+
/**
8+
* P142
9+
* 测试sleep()期间其他线程是否执行
10+
* 处理器资源,对象锁,是不同的概念
11+
*
12+
*/
13+
public class Run2_sleep {
14+
public static void main(String[] args) {
15+
Thread t1 =new Thread(){
16+
@Override
17+
public void run() {
18+
super.run();
19+
System.out.println(Thread.currentThread().getName()+" begin sleep");
20+
try {
21+
Thread.sleep(2000);
22+
} catch (InterruptedException e) {
23+
e.printStackTrace();
24+
}
25+
System.out.println(Thread.currentThread().getName()+" end sleep");
26+
}
27+
};
28+
t1.setName("t1");
29+
30+
Thread t2 = new Thread(){
31+
@Override
32+
public void run() {
33+
super.run();
34+
long i =0;
35+
long max = (long)Integer.MAX_VALUE;
36+
System.out.println("max = "+max);
37+
38+
System.out.println(Thread.currentThread().getName()+" begin while");
39+
while(i<max){
40+
i++;
41+
if(i%100000000==0){
42+
System.out.println(Thread.currentThread().getName()+" now is "+i);
43+
}
44+
}
45+
System.out.println(Thread.currentThread().getName()+" end while");
46+
}
47+
};
48+
t2.setName("t2");
49+
50+
t1.start();
51+
t2.start();
52+
53+
}
54+
}
55+
56+
/*
57+
输出:
58+
t1 begin sleep
59+
max = 2147483647
60+
t2 begin while
61+
t2 now is 100000000
62+
t2 now is 200000000
63+
t2 now is 300000000
64+
t2 now is 400000000
65+
t2 now is 500000000
66+
t2 now is 600000000
67+
t2 now is 700000000
68+
t2 now is 800000000
69+
t2 now is 900000000
70+
t2 now is 1000000000
71+
t2 now is 1100000000
72+
t2 now is 1200000000
73+
t2 now is 1300000000
74+
t2 now is 1400000000
75+
t2 now is 1500000000
76+
t1 end sleep
77+
t2 now is 1600000000
78+
t2 now is 1700000000
79+
t2 now is 1800000000
80+
t2 now is 1900000000
81+
t2 now is 2000000000
82+
t2 now is 2100000000
83+
t2 end while
84+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.brianway.learning.java.multithread.communication.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
7+
/**
8+
* P137
9+
* wait()永远阻塞
10+
*/
11+
public class Run2_wait {
12+
public static void main(String[] args) {
13+
try {
14+
String lock = new String();
15+
System.out.println("syn上面");
16+
synchronized (lock){
17+
System.out.println("syn第一行,wait前面");
18+
lock.wait();
19+
System.out.println("wait下面的代码");
20+
}
21+
System.out.println("syn下面的代码");
22+
} catch (InterruptedException e) {
23+
e.printStackTrace();
24+
}
25+
}
26+
}
27+
28+
/*
29+
输出:
30+
syn上面
31+
syn第一行,wait前面
32+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.brianway.learning.java.multithread.communication.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
public class Thread1 extends Thread{
7+
private Object lock;
8+
9+
public Thread1(Object lock) {
10+
super();
11+
this.lock = lock;
12+
}
13+
14+
@Override
15+
public void run() {
16+
try {
17+
synchronized (lock){
18+
System.out.println("开始 wait time="+System.currentTimeMillis());
19+
lock.wait();
20+
System.out.println("结束 wait time="+System.currentTimeMillis());
21+
}
22+
} catch (InterruptedException e) {
23+
e.printStackTrace();
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.brianway.learning.java.multithread.communication.example2;
2+
3+
/**
4+
* Created by Brian on 2016/4/13.
5+
*/
6+
public class Thread2 extends Thread{
7+
private Object lock;
8+
9+
public Thread2(Object lock) {
10+
super();
11+
this.lock = lock;
12+
}
13+
14+
@Override
15+
public void run() {
16+
17+
synchronized (lock){
18+
System.out.println("开始 notify time="+System.currentTimeMillis());
19+
lock.notify();
20+
try {
21+
Thread.sleep(2000);
22+
} catch (InterruptedException e) {
23+
e.printStackTrace();
24+
}
25+
System.out.println("结束 notify time="+System.currentTimeMillis());
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)