Java并发核心-exchanger

Exchanger类的做用

Exchanger的功能能够使两个线程(重点: 只有两个线程)之间传输数据

  • 重点是exchange()方法java

  • exchange()方法是阻塞执行的,能够设置超时时间 可调用不一样的Apiide

    package com.f.fmodules.fuser.example.exchanger;
    
    	import java.util.concurrent.Exchanger;
    
    	public class ExchangerThread extends Thread{
    
    		private Exchanger<String> exchanger;
    		private String threadName;
    		private String changeString;
    
    
    		ExchangerThread(String threadName, String changeString, Exchanger<String> exchanger) {
    			super();
    			this.threadName = threadName;
    			this.changeString = changeString;
    			this.exchanger = exchanger;
    		}
    
    		@Override
    		public void run() {
    			try {
    				System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString));
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    
    	}
    package com.f.fmodules.fuser.example.exchanger;
    
    	import java.util.concurrent.Exchanger;
    
    	public class ExchangerTest {
    
    		public static void main(String[] args) {
    			Exchanger<String> exchanger = new Exchanger<>();
    			ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger);
    			ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger);
    			t1.start();
    			t2.start();
    		}
    
    	}
  • 运行结果
    this

  • 例: 三个线程操做线程

    package com.f.fmodules.fuser.example.exchanger;
    
    	import java.util.concurrent.Exchanger;
    
    	public class ExchangerTest {
    
    		public static void main(String[] args) {
    			Exchanger<String> exchanger = new Exchanger<>();
    			ExchangerThread t1 = new ExchangerThread("1","changString1", exchanger);
    			ExchangerThread t2 = new ExchangerThread("2","changString2", exchanger);
    			ExchangerThread t3 = new ExchangerThread("3","changString3", exchanger);
    			t1.start();
    			t2.start();
    			t3.start();
    		}
    
    	}
  • 此时程序的运行结果是不肯定的,屡次运行能够发现,配对结果多是Thread[2]和Thread[3]交换,也多是Thread[1]和Thread[2]交换,而剩下的未获得配对的线程,则会被阻塞,永久等待,直到与之配对的线程到达位置,对于本程序,则只能强制将其中止code

  • 阻塞状态
    blog

  • 可设置五秒超时时间it

    System.out.println("Thread[" + threadName + "]交换到消息:" + exchanger.exchange(changeString, 5, TimeUnit.SECONDS));
  • 运行结果io

相关文章
相关标签/搜索