java两个线程交替执行
2015-07-25 20:58
603 查看
这个问题的来源是一个题目:线程A循环10次,线程B循环100,接着又回到线程A循环10次,接着再回到线程B又循环100,如此循环50次。
一般来说线程锁可以用:synchronized、Lock。这个题目的难点不在于同步块,而在于怎么样设计这个两个线程的交替实现。由于线程争用cpu的随机性,就需要A线,B线程执行,在B执行完一次进入等待之前唤醒A,如此往复,那么这里就要用上notify和wait了。
/* * Copyright (c) 2014 Qunar.com. All Rights Reserved. */ /** * @author: wangh.wang Date: 2015/7/22 Time: 21:15 */ public class Thread1 { public static void main(String args[]) { final Bussiness business = new Bussiness(); Thread a=new Thread(new Runnable(){ @Override public void run(){ business.SubThread(); } }); Thread b=new Thread((new Runnable() { @Override public void run() { business.MainThread(); } })); a.start(); b.start(); } } class Bussiness { private static Object LOCK = new Object(); volatile boolean bShouldSub = true;//这里相当于定义了控制该谁执行的一个信号灯 public void MainThread() { for (int i = 0; i < 50; i++) { synchronized (LOCK) {//notify和wait的对象一定要和synchronized的对象保持一致 for (int j = 0; j < 10; j++) { System.out.println(Thread.currentThread().getName() + "+MainThread:i=" + i + ",j=" + j); } if (bShouldSub) { bShouldSub = false; LOCK.notify(); if(i<49){ try { LOCK.wait(); }catch (InterruptedException e) { // TODO Auto-generatedcatch block e.printStackTrace(); } } } } } } public void SubThread() { for (int i = 0; i < 50; i++) { synchronized (LOCK){ for (int j = 0; j < 5; j++) { System.out.println(Thread.currentThread().getName() + "+SubThread:i=" + i + ",j=" + j); } if (!bShouldSub) { bShouldSub = true; LOCK.notify(); if(i<49){ try { LOCK.wait(); } catch (InterruptedException e) { // TODO Auto-generatedcatch block e.printStackTrace(); } } } } } } }
相关文章推荐
- springMybatis整合步骤
- eclipse构建HBase开发环境并运行实例对Hbase建表增删改查
- 关于Java的转义字符
- java 基础之 反射技术
- java 基础之 反射技术
- Java 开发环境配置
- 精通Hibernate——Java的内存地址与Hibernate的内置对象标识符
- Spring中实现多数据源事务管理
- [Java Web]Struts2加起来(一个)
- 一个经典例子让你彻彻底底理解java回调机制
- 《深入理解java虚拟机》:类的初始化
- Java 中 Map 的使用
- java 基础之枚举
- java 基础之枚举
- Spring AOP 异常:IllegalArgumentException: error at ::0 can't find referenced pointcut
- Struts2的配置文件——web.xml
- java之可变参数
- 与阿根廷一起学习Java Web四个发展:对于信息传输和信息传输
- java之可变参数
- java多线程学习笔记——有关多线程的文章连接汇总