多线程间的通信问题之交替打印

1.要实现的效果,直接上图:

1.具体逻辑很清晰,就是通过多线程来实现直接上代码,lock控制相同的输入或输出线程的同步,resource控制着输入和输出线程的同步

class Resource
{
	private String name;
	private String sex;
	private boolean flag;
	public void setName(String name)
	{
		this.name=name;
	}
	public void setSex(String sex)
	{
		this.sex=sex;
	}
	public void setFlag(boolean flag)
	{
		this.flag=flag;
	}
	public String getName()
	{
		return this.name;
	}
	public String getSex()
	{
		return this.sex;
	}
	public boolean getFlag()
	{
		return this.flag;
	}
}
class Input implements Runnable
{
	private static final Object lock=new Object();
	int num=0;
	Resource resource;
	public Input(Resource resource)
	{
		this.resource=resource;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (!Thread.interrupted()) {//调用interrupt方法时终止线程
			synchronized (lock) {
				synchronized (resource) {
					if(resource.getFlag())
					{
						try {
							resource.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					if((num&1)==0)//用奇数偶数来实现交替输出
					{
						resource.setSex("male");
						resource.setName("mnmlist");
					}else{
						resource.setSex("female");
						resource.setName("sting");
					}
					num++;
					if(num>10000)
						Thread.currentThread().interrupt();
					resource.setFlag(true);
					resource.notify();
				}
			}
		}
	}

}
class Output implements Runnable
{
	private static final Object lock=new Object();
	int num=0;
	Resource resource;
	public Output(Resource resource)
	{
		this.resource=resource;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (!Thread.interrupted()) {
			synchronized (lock) {
				synchronized (resource) {
					if(!resource.getFlag())
					{
						try {
							resource.wait();
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
					System.out.println(Thread.currentThread().getName()+","+(++num)+"th,姓名:"+resource.getName()+",性别:"+resource.getSex());
					if(num>10000)
						Thread.currentThread().interrupt();
					resource.setFlag(false);
					resource.notify();
				}
			}
		}
	}

}
public class OneAfterAnotherOutput {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Resource resource=new Resource();
		Input input=new Input(resource);
		Output output=new Output(resource);
		Input input1=new Input(resource);
		Output output1=new Output(resource);
		Thread inputThread=new Thread(input);
		Thread outputThread=new Thread(output);
		Thread inputThread1=new Thread(input1);
		Thread outputThread1=new Thread(output1);
		inputThread.start();
		outputThread.start();
		inputThread1.start();
		outputThread1.start();
	}

}
时间: 2024-10-12 14:41:59

多线程间的通信问题之交替打印的相关文章

JAVA学习第二十六课(多线程(五))- 多线程间的通信问题

一.线程间的通信 实例代码: 需求是:输入一个姓名和性别后,就输出一个姓名和性别 class Resource { String name; String sex ; } class Input implements Runnable { Resource r; Input(Resource r) { this.r = r; } public void run() { int x = 0; while(true) { synchronized (r) { if(x==0) { r.name =

Java多线程间的通信问题扩展

到底什么是线程间的通信? 线程间需要通过一些协调性的通信,实现共同完成同一件任务,简单说就是,你想做这件事,我也想做这件事,我们两个相互交流,共同做这件事,而共同任务的同步性的实现,就必须通过同步锁,每一个对象实例都有自己的一把锁,当一个线程想要对这个任务进行处理的时候,就必须获得这把锁.线程之间锁的释放与获取,是通过Object类中的wait()/notify()方法实现的.wait()方法是将当前拥有锁的线程至于等待状态让其释放锁,而notify()方法是唤醒其他线程使其具备执行资格,过来拿

黑马程序员-学习日记(多线程间的通信)

 ------Java EE培训.Android培训.iOS培训.期待与您交流! ------- 示例: //将资源封装成对象 class Resour { String name; String gender; } //将线程执行的任务封装成对象 class Input implements Runnable { private Resour r; Input(Resour r) { this.r = r; } public void run() { int x =0; while(true)

java多线程详解(6)-线程间的通信wait及notify方法

Java多线程间的通信 本文提纲 一. 线程的几种状态 二. 线程间的相互作用 三.实例代码分析 一. 线程的几种状态 线程有四种状态,任何一个线程肯定处于这四种状态中的一种:(1). 产生(New):线程对象已经产生,但尚未被启动,所以无法执行.如通过new产生了一个线程对象后没对它调用start()函数之前.(2). 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它. 当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它

Java 多线程间的通讯

在前一小节,介绍了在多线程编程中使用同步机制的重要性,并学会了如何实现同步的方法来正确地访问共享资源.这些线程之间的关系是平等的,彼此之间并不存在任何依赖,它们各自竞争CPU资源,互不相让,并且还无条件地阻止其他线程对共享资源的异步访问.然而,也有很多现实问题要求不仅要同步的访问同一共享资源,而且线程间还彼此牵制,通过相互通信来向前推进.那么,多个线程之间是如何进行通信的呢? 解决思路 在现实应用中,很多时候都需要让多个线程按照一定的次序来访问共享资源,例如,经典的生产者和消费者问题.这类问题描

VC++多线程编程-线程间的通信和线程同步

引用:http://blog.csdn.net/zjc0888/article/details/7372258 线程间通讯 一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信.这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的,下面将进行说明. 使用全局变量进行通信 由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量.对于标准类型

学习多线程3---线程之间的通信

两个线程交替打印 1.使用synchronized,wait,notify关键字实现 package com.hzm.test; /* * 两个线程交替打印 */ public class Communication { public static void main(String[] args) { // TODO Auto-generated method stub final Business business = new Business(); new Thread(new Runnab

iOS多线程技术—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE

iOS开发多线程篇—线程间的通信

iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任务后,转到另1个线程继续执行任务 线程间通信常用方法 - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; - (void)performSelector:(SE