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
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!