Java多线程中线程间的通信实例详解
Java多线程中线程间的通信
一、使用while方式来实现线程之间的通信
packagecom.ietree.multithread.sync; importjava.util.ArrayList; importjava.util.List; publicclassMyList{ privatevolatilestaticListlist=newArrayList(); publicvoidadd(){ list.add("apple"); } publicintsize(){ returnlist.size(); } publicstaticvoidmain(String[]args){ finalMyListlist1=newMyList(); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ try{ for(inti=0;i<10;i++){ list1.add(); System.out.println("当前线程:"+Thread.currentThread().getName()+"添加了一个元素.."); Thread.sleep(500); } }catch(InterruptedExceptione){ e.printStackTrace(); } } },"t1"); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ while(true){ if(list1.size()==5){ System.out.println("当前线程收到通知:"+Thread.currentThread().getName()+"listsize=5线程停止.."); thrownewRuntimeException(); } } } },"t2"); t1.start(); t2.start(); } }
程序输出:
当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. Exceptioninthread"t2"当前线程收到通知:t2listsize=5线程停止.. java.lang.RuntimeException atcom.ietree.multithread.sync.MyList$2.run(MyList.java:43) atjava.lang.Thread.run(UnknownSource) 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素..
理解:线程Thread2不停地通过while语句检测这个条件(list.size()==5)是否成立,从而实现了线程间的通信。但是这种方式会浪费CPU资源。
二、waitnotfiy方法实现多线程中线程之间的通信
使用这种方式实现线程通信需要注意:wait和notify必须配合synchronized关键字使用,wait方法释放锁,notify方法不释放锁。并且在这个例子中必须是Thread2先执行才可以。
packagecom.ietree.multithread.sync; importjava.util.ArrayList; importjava.util.List; publicclassListAdd3{ privatevolatilestaticListlist=newArrayList(); publicvoidadd(){ list.add("apple"); } publicintsize(){ returnlist.size(); } publicstaticvoidmain(String[]args){ finalListAdd2list2=newListAdd2(); //1实例化出来一个lock //当使用wait和notify的时候,一定要配合着synchronized关键字去使用 finalObjectlock=newObject(); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ try{ synchronized(lock){ for(inti=0;i<10;i++){ list2.add(); System.out.println("当前线程:"+Thread.currentThread().getName()+"添加了一个元素.."); Thread.sleep(500); if(list2.size()==5){ System.out.println("已经发出通知.."); //不释放锁,遇到size=5时还是继续执行 lock.notify(); } } } }catch(InterruptedExceptione){ e.printStackTrace(); } } },"t1"); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ synchronized(lock){ if(list2.size()!=5){ try{ //释放锁,让其他线程执行 lock.wait(); }catch(InterruptedExceptione){ e.printStackTrace(); } } System.out.println("当前线程:"+Thread.currentThread().getName()+"收到通知线程停止.."); thrownewRuntimeException(); } } },"t2"); t2.start(); t1.start(); } }
程序输出:
当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 已经发出通知.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t2收到通知线程停止.. Exceptioninthread"t2"java.lang.RuntimeException atcom.ietree.multithread.sync.ListAdd3$2.run(ListAdd3.java:59) atjava.lang.Thread.run(UnknownSource)
三、使用CountDownLatch类来实现多线程中线程之间的实时通信
packagecom.ietree.multithread.sync; importjava.util.ArrayList; importjava.util.List; importjava.util.concurrent.CountDownLatch; publicclassListAdd2{ privatevolatilestaticListlist=newArrayList(); publicvoidadd(){ list.add("apple"); } publicintsize(){ returnlist.size(); } publicstaticvoidmain(String[]args){ finalListAdd2list2=newListAdd2(); finalCountDownLatchcountDownLatch=newCountDownLatch(1); Threadt1=newThread(newRunnable(){ @Override publicvoidrun(){ try{ for(inti=0;i<10;i++){ list2.add(); System.out.println("当前线程:"+Thread.currentThread().getName()+"添加了一个元素.."); Thread.sleep(500); if(list2.size()==5){ System.out.println("已经发出通知.."); countDownLatch.countDown(); } } //} }catch(InterruptedExceptione){ e.printStackTrace(); } } },"t1"); Threadt2=newThread(newRunnable(){ @Override publicvoidrun(){ if(list2.size()!=5){ try{ countDownLatch.await(); }catch(InterruptedExceptione){ e.printStackTrace(); } } System.out.println("当前线程:"+Thread.currentThread().getName()+"收到通知线程停止.."); thrownewRuntimeException(); } },"t2"); t2.start(); t1.start(); } }
程序输出:
当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 已经发出通知.. Exceptioninthread"t2"当前线程:t1添加了一个元素.. 当前线程:t2收到通知线程停止.. java.lang.RuntimeException atcom.ietree.multithread.sync.ListAdd2$2.run(ListAdd2.java:56) atjava.lang.Thread.run(UnknownSource) 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素.. 当前线程:t1添加了一个元素..
四、使用多线程模拟一个队列
packagecom.ietree.multithread.sync; importjava.util.LinkedList; importjava.util.concurrent.TimeUnit; importjava.util.concurrent.atomic.AtomicInteger; publicclassMyQueue{ //1、定义一个盛装元素集合 privateLinkedList
程序输出:
新加入的元素为:a 新加入的元素为:b 新加入的元素为:c 新加入的元素为:d 新加入的元素为:e 当前容器的长度:5 移除的元素为:a 移除的元素为:b 新加入的元素为:f 新加入的元素为:g
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!