Java学习之多线程同步 <好程序员特训营>

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流!

要求:用两个线程分别输出0到100之间的奇数和偶数,要求先输出10个奇数,再输出10个偶数,再输出10个奇数,以此类推

//Print类
public class Print {
	public void odd(int i){
		System.out.println(Thread.currentThread().getName() + "输出:" + i);
	}
	public void even(int i){
		System.out.println(Thread.currentThread().getName() + "输出:" + i);
	}
}
//PrintOdd.java
public class PrintOdd extends Thread {
	private Print p;

	public PrintOdd(Print p) {
		this.p = p;
	}

	public void run() {
		int count = 0;//控制循环次数(10次循环后等待)
		for (int i = 0; i < 100; i += 2) {
			synchronized (p) {
				p.odd(i);
				count++;
				if (count == 10) {
					count = 0;
					try {
						p.wait();//输出10个数后该线程等待
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				p.notifyAll();//唤醒其他线程
			}
		}
	}
}
//PrintEven.java
public class PrintEven extends Thread {
	private Print p;
	public PrintEven(Print p) {
		this.p = p;
	}

	public void run(){
		int count = 0;
		for (int i = 1; i < 100; i += 2) {
			synchronized (p) {
				p.even(i);
				count++;
				if (count == 10) {
					count = 0;
					try {
						p.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				p.notifyAll();
			}
		}
	}
}
//TestDemo.java
public class TestDemo {
	public static void main(String[] args) {
		Print p = new Print();
		new PrintEven(p).start();
		new PrintOdd(p).start();
	}
}
时间: 2024-10-11 15:24:59

Java学习之多线程同步 <好程序员特训营>的相关文章

Java学习笔记---多线程同步的五种方法

一.引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊.闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常.举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块.假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0.那到底是哪个呢?很难说清楚.因此多线程同步就

Java学习之多线程(sleep()和wait()的相同与不同点) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! sleep()和wait()的相同点: (1) 都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回 (2) 都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException. sleep()和

Java学习之异常 &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.异常:就是程序在运行时出现不正常情况. 异常由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述.并封装成对象.其实就是java对不正常情况进行描述后的对象体现. 对于问题的划分:两种:一种是严重的问题,一种非严重的问题. a)对于严

Java学习之集合框架(2) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.Set接口 Set集合不允许重复元素,是因为Set判断两个对象相同不是使用==运算符,而是根据equals方法.即两个对象用equals方法比较返回true,Set就不能接受两个对象. public class SetDemo { public static

Java学习之StringBuffer &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.StringBuffer是字符串缓冲区,是一个容器. 特点: 1)长度是可变化的. 2)可以字节操作多个数据类型. 3)最终会通过toString方法变成字符串. 2.StringBuffer的方法: 1)存储. StringBuffer append():

Java学习之面向对象(概念性质) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.面向对象:三个特征:封装,继承,多态 2.开发过程:其实就是找对象使用.没有对象,就创建一个对象 3.类和对象的关系. 现实生活中的对象:张三 李四. 想要描述:提取对象中共性内容.对具体的抽象. 描述时:这些对象的共性有:姓名,年龄,性别,学习java功能

【好程序员特训营】Java线程同步初探

对于同步,在具体的Java代码中需要完成以下两个操作: 把竞争访问的资源标识为private: 同步那些修改变量的代码,使用synchronized关键字同步方法火代码. synchronized关键字智能标记费抽象方法,不能标记成员变量 为了演示同步方法的使用,构建了一个信用卡账户,起初信用额为100w,然后模拟透支.存款等多个操作.显然银行账户User对象是个竞争资源,而多个并发操作的是账户方法oper(int x),当然应该在此方法上加上同步,并将账户的余额设为私有变量,禁止直接访问. 以

Java学习之集合框架(1) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 集合框架图: 1. Collection Collection定义了集合框架的共性功能. 1)添加  add(e);  addAll(collection); 2)删除  remove(e);  removeAll(collection);  clear();

Java学习之面向对象(封装、构造函数、this关键字) &lt;好程序员特训营&gt;

<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流! 1.封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处:  (1)将变化隔离.  (2)便于使用.  (3)提高重用性.  (4)提高安全性. 原则:  (1)将不需要对外提供的内容都隐藏起来.  (2)把属性都隐藏,提供公共方法对其访问. 2.