爪哇 交换者示例

它具有两个重载版本的交换方法。
- 交换(V x): 它等待另一个线程到达交换点并与该线程交换对象。
- 交换(V x,长超时,TimeUnit单位): 它等待另一个线程 特定时间间隔 在方法中提供并与该线程交换对象。
我们有两个线程,即生产者和消费者,它们将交换Country对象。生产者将创建国家对象,而消费者将返回虚拟国家对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
包 组织 . Arpit . 爪哇 2blog; 上市 类 国家 { 私人的 串 国家的名字; 上市 国家 ( 串 国家的名字) { 超 (); 这个 .国家的名字 = 国家的名字; } 上市 串 getCountryName() { 返回 国家的名字; } } |
现在,我们将创建一个名为ExchangerExampleMain.java的主类,另外还有两个名为Producer和Consumer的类,它们将实现可运行的接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
包 组织 . Arpit . 爪哇 2blog; 进口 爪哇 . 实用程序 .同时.交换者; 上市 类 交换者ExampleMain { 上市 静态的 虚空 主要 ( 串 [] args ) { 交换者 交换器 = 新 交换者(); //开始两个线程 新 线 ( 新 制片人(交换器)). 开始 (); 新 线 ( 新 消费者(交换器)). 开始 (); } } 类 制片人 实施 可运行 { 交换者 前 ; 制片人(交换者 前 ){ 这个 . 前 = 前 ; } @覆写 上市 虚空 跑 () { 对于 ( 整型 i = 0; i < 2; i ++ ){ 国家 国家 = 空值 ; 如果 (i == 0) 国家 = 新 国家 ( “印度” ); 其他 国家 = 新 国家 (“不丹”); 尝试 { //与虚拟的Country对象交换 国家 虚拟国家 = 前 .交换( 国家 ); 系统 . 出 . 打印 (“来自消费者线程的国家对象:”+虚拟国家.getCountryName()); } 抓住 (InterruptedException e) { 系统 . 出 . 打印 (e); } } } } 类 消费者 实施 可运行 { 交换者 前 ; 消费者(交换者 前 ){ 这个 . 前 = 前 ; } @覆写 上市 虚空 跑 () { 对于 ( 整型 i = 0; i < 2; i ++ ){ 尝试 { //从生产者线程获取Country对象 //返回虚拟国家对象 国家 国家 = 前 .交换( 新 国家 ( “假” )); 系统 . 出 . 打印 (“来自生产者线程的国家对象:”+ 国家 .getCountryName()); } 抓住 (InterruptedException e) { 系统 . 出 . 打印 (e); } } } } |
当您在程序上方运行时,将得到以下输出。
1 2 3 4 5 6 |
得到 国家 目的 从 消费者 线 : 假 得到 国家 目的 从 制片人 线 : 印度 得到 国家 目的 从 消费者 线 : 假 得到 国家 目的 从 制片人 线 : 不丹 |
如果您注意到,生产者已经与消费者交换了两个国家对象(印度和不丹),并得到了虚拟国家对象作为回报。
如果您想了解更现实的使用Exchanger。生产者和消费者可以交换缓冲区。当缓冲区已满时,生产者将为消费者提供完整的缓冲区,而消费者将返回空缓冲区作为回报。