学习多线程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 Runnable(){

		@Override
		public void run() {
			// TODO Auto-generated method stub
			for(int j = 0 ;j < 50;j++){
				business.sub(j);
			}
		}
	   }).start();

   	   for(int j = 0 ;j < 50;j++){
   		  business.main(j);
	   }

	}

}
class Business{
	private boolean bShouldSub = true;
	public synchronized void sub(int j){
		/*
		 * if改为while语句更健壮
		 */
		 if(!bShouldSub){
			 try {
				this.wait();
			 } catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			 }
		 }

		 for(int i = 0;i < 10;i++){
			   System.out.println("子"+"i= "+i+"j= "+j);
		 }
		 bShouldSub = false;
		 this.notify();

	}
	public synchronized void main(int j){
		 if(bShouldSub){
				try {
				    this.wait();
				}   catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		 }
		 for(int i = 0;i < 10;i++){
			    System.out.println("父"+"i= "+i+"j= "+j);
		 }
		 bShouldSub = true;
		 this.notify();
	}
}

  使用condition信号量实现线程之间通信

package com.condition;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ConditionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Business business = new Business();
	       new Thread(new Runnable(){

			@Override
			public void run() {

				for(int j = 0 ;j < 50;j++){
					business.sub(j);
				}
			}
		   }).start();

   	   for(int j = 0 ;j < 50;j++){
	   		  business.main(j);
	   }
	}

}

class Business{
    Lock lock = new ReentrantLock();
	Condition condition = lock.newCondition();
	private boolean bShouldSub = true;
	public  void sub(int j){
		/*
		 * if改为while语句更健壮
		 */
		 lock.lock();
		 try{
			 if(!bShouldSub){
				 try {
					//this.wait();
					 condition.await();
				 } catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				 }
			 }

			 for(int i = 0;i < 10;i++){
				   System.out.println("子"+"i= "+i+"j= "+j);
			 }
			 bShouldSub = false;
			// this.notify();
			 condition.signal();
		 }catch(Exception e){
			 e.printStackTrace();
		 }finally{
			 lock.unlock();
		 }
	}
	public void main(int j){
		lock.lock();
		try{
			if(bShouldSub){
					try {
					    //this.wait();
						 condition.await();
					}   catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			 }
			 for(int i = 0;i < 10;i++){
				    System.out.println("父"+"i= "+i+"j= "+j);
			 }
			 bShouldSub = true;
			 //this.notify();
			 condition.signal();
		}finally{
			lock.unlock();
		}
	}
}

  三个线程交替打印,使用信号量实现

package com.test;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreeconditionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		final Business business = new Business();
	       new Thread(new Runnable(){

			@Override
			public void run() {

				for(int j = 0 ;j < 50;j++){
					business.sub2(j);
				}
			}
		   }).start();

	       new Thread(new Runnable(){

				@Override
				public void run() {

					for(int j = 0 ;j < 50;j++){
						business.sub3(j);
					}
				}
			   }).start();

	   	   for(int j = 0 ;j < 50;j++){
	   		  business.main(j);
		   }
	}

}
class Business{
	Lock lock = new ReentrantLock();
	Condition condition1 = lock.newCondition();
	Condition condition2 = lock.newCondition();
	Condition condition3 = lock.newCondition();
	private int bShouldSub = 1;
	public  void sub2(int j){
		/*
		 * if改为while语句更健壮
		 */
		 lock.lock();
		 try{
			 if(bShouldSub!=2){
				 try {
					//this.wait();
					 condition2.await();
				 } catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				 }
			 }

			 for(int i = 0;i < 10;i++){
				   System.out.println("子"+"i= "+i+"j= "+j);
			 }
			 bShouldSub = 3;
			// this.notify();
			 condition3.signal();
		 }catch(Exception e){
			 e.printStackTrace();
		 }finally{
			 lock.unlock();
		 }
	}
	public  void sub3(int j){
		/*
		 * if改为while语句更健壮
		 */
		 lock.lock();
		 try{
			 if(bShouldSub !=3){
				 try {
					//this.wait();
					 condition3.await();
				 } catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				 }
			 }

			 for(int i = 0;i < 10;i++){
				   System.out.println("子子"+"i= "+i+"j= "+j);
			 }
			 bShouldSub = 1;
			// this.notify();
			 condition1.signal();
		 }catch(Exception e){
			 e.printStackTrace();
		 }finally{
			 lock.unlock();
		 }
	}
	public void main(int j){
		lock.lock();
		try{
			if(bShouldSub != 1){
					try {
					    //this.wait();
						 condition1.await();
					}   catch (Exception e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
			 }
			 for(int i = 0;i < 10;i++){
				    System.out.println("父"+"i= "+i+"j= "+j);
			 }
			 bShouldSub = 2;
			 //this.notify();
			 condition2.signal();
		}finally{
			lock.unlock();
		}
	}
}

  

时间: 2024-10-08 19:30:27

学习多线程3---线程之间的通信的相关文章

Java多线程中线程间的通信

一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } public int size() {

Java学习笔记46(多线程三:线程之间的通信)

多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个线程一个输入,一个输出 package demo; public class Resource { public String name; public String sex; } 输入线程: package demo; public class Input implements Runnable

iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码) 三.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(存钱取钱的例子,多个售票员卖票的例子) 安全隐患解决的方法 --- 互斥锁(图解)

VC中利用多线程技术实现线程之间的通信

文章来源:[url]http://www.programfan.com/article/showarticle.asp?id=2951[/url] 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.

vc 基于对话框多线程编程实例——线程之间的通信

 vc基于对话框多线程编程实例--线程之间的通信 实例: vc 基于对话框多线程编程实例--线程之间的通信,码迷,mamicode.com

基础学习day12--多线程一线程之间的通信和常用方法

一.线程之间的通信 1.1.线程之间的通信方法 多个线程在处理统一资源,但是任务却不同,这时候就需要线程间通信.    等待/唤醒机制涉及的方法:    1. wait():让线程处于冻结状态,被wait的线程会被存储到线程池中.    2. notify():唤醒线程池中的一个线程(任何一个都有可能).    3. notifyAll():唤醒线程池中的所有线程.  备注    1.这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法.    2.必须要明确到底操作的是哪个锁上的线

多线程之多窗口卖票&amp;线程之间的通信

案例一:使用多线程完成三个窗口卖票(不能出现重复卖票以及负数票) 卖票程序SellTicket 这里使用Lock类中的方法实现加锁和释放锁! package cn.itcast.thread2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int ticke

多线程 线程之间的通信

//  DYFViewController.m //  623-06-线程间的通信 // //  Created by dyf on 14-6-23. //  Copyright (c) 2014年 ___FULLUSERNAME___. All rights reserved. // #import "DYFViewController.h" @interface DYFViewController () @property (weak, nonatomic) IBOutlet UI

线程之间的通信

1.1.线程之间的通信方法 多个线程在处理统一资源,但是任务却不同,这时候就需要线程间通信.    等待/唤醒机制涉及的方法:    1. wait():让线程处于冻结状态,被wait的线程会被存储到线程池中.    2. notify():唤醒线程池中的一个线程(任何一个都有可能).    3. notifyAll():唤醒线程池中的所有线程.  备注    1.这些方法都必须定义在同步中,因为这些方法是用于操作线程状态的方法.    2.必须要明确到底操作的是哪个锁上的线程!    3.wa

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

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