| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 number | Diff line number | Diff 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 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments