`
xfxlch
  • 浏览: 167511 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

线程间的通信

    博客分类:
  • Java
 
阅读更多
编程实现:
子线程循环10次,主线程循环100次,子线程再循环10次,主线程再循环100次,如此线程间交替执行50个轮回。

首先我们要有主子两个线程来分别执行10,100次的循环操作,这个相对来说简单:
TraditionalThreadCommuniction.class 是我的类名
public static void main(String[] args) {
		new Thread(new Runnable() {
			public void run() {
				// 子线程执行
				for (int j = 0; j < 50; j++) {// 轮回50次
					synchronized (TraditionalThreadCommuniction.class) {

						for (int i = 0; i < 10; i++) {
							System.out.println("sub thread id " + i);
						}

					}
				}
			}
		}).start();
		// 主线程执行
		for (int j = 0; j < 50; j++) {// 轮回50次
			synchronized (TraditionalThreadCommuniction.class) {

				for (int i = 0; i < 100; i++) {
					System.out.println("main thread id " + i);
				}
			}
		}
	}

上面这样就可以子线程和主线程就可以完成各自的循环任务了。
但是这样做并没有达到,主子线程都各自执行一次,然后轮回50次的要求。为此我们要对我们的代码进行改造。

首先我们对我们的主子线程任务进行抽象,把线程任务放到一个统一的类里,进行统一处理。
如下:
public static void main(String[] args) {
		final Bisuness bisuness = new Bisuness();
		new Thread(new Runnable() {
			public void run() {
				// 子线程执行
				for (int j = 0; j < 50; j++) {// 轮回50次
					bisuness.sub(j);
				}
			}
		}).start();
		
		// 主线程执行
		for (int j = 0; j < 50; j++) {// 轮回50次
			bisuness.main(j);
		}
	}
	
	static class Bisuness {
		public synchronized void sub(int j) {
			for (int i = 0; i < 10; i++) {
				System.out.println("sub thread id " + i + " loop id " + j);
			}
		}

		public synchronized void main(int j) {
			for (int i = 0; i < 100; i++) {
				System.out.println("main thread id " + i + " loop id " + j);
			}
		}
	}


这是面向对象编程的思路,把相关业务处理类放到一个class里,其他业务方法只要调方法就就可以了,做到业务对外来应用的一个透明。

当然这样做还是不够的,并没有到达两个线程间通信和相互协作的目的。
通常为了让两者之间通信,我们需要添加一个变量bSubTread=true,当子线程执行好的时候,我们让子线程停下来,并且通知主线程去执行任务,主线程跑完之后,主线程再自己停下来,通知子线程去执行。如此才能达到我们最初的目的
最后的代码就是这个样子了:
public static void main(String[] args) {
		final Bisuness bisuness = new Bisuness();
		new Thread(new Runnable() {
			public void run() {
				// 子线程执行
				for (int j = 0; j < 50; j++) {// 轮回50次
					bisuness.sub(j);
				}
			}
		}).start();
		
		// 主线程执行
		for (int j = 0; j < 50; j++) {// 轮回50次
			bisuness.main(j);
		}
	}
	
	static class Bisuness {
		boolean bSubTread = true;
		public synchronized void sub(int j) {
			if(!bSubTread) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			for (int i = 0; i < 10; i++) {
				System.out.println("sub thread id " + i + " loop id " + j);
			}
			bSubTread = false;
			this.notify();
		}

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

分享到:
评论
2 楼 xfxlch 2014-07-07  
Andand 写道
这是张孝祥老师讲的视频的例子吧

1 楼 Andand 2014-07-06  
这是张孝祥老师讲的视频的例子吧

相关推荐

    MFC线程间通信

    然而,当一个应用程序中有多个线程运行时,它们可能需要共享数据或协调工作,这就涉及到线程间通信(Inter-Thread Communication,简称ITC)。MFC(Microsoft Foundation Classes)库,作为Windows平台上C++开发的...

    线程间通信方式3:消息传递方式

    4. **三种线程通信方式结合**: - 在这个示例中,可能结合了同步和异步消息传递、事件对象(如事件句柄)以及信号量等机制。 - 同步消息传递:等待消息被处理后再继续执行,如SendMessage。 - 异步消息传递:发送...

    线程间通信的定义及全局变量的方法

    本文将重点探讨线程间的通信方式,特别是通过全局变量进行线程间通信的方法以及为了解决数据竞争问题而引入的同步和互斥机制。 首先,线程间通信指的是在同一个进程中的多个线程之间交换信息或数据的过程。由于线程...

    VC多线程例程七及图解文档(线程间通信)

    本文将深入探讨“VC多线程例程七”,重点介绍线程间通信这一关键概念,并结合源码分析,以MultiThread7项目为例进行详细讲解。 线程是操作系统分配CPU时间的基本单位,一个进程中可以有多个线程并行运行。在VC++中...

    线程间通信方式2:参数传递方式

    在多线程编程中,线程间的通信是一个关键概念,特别是在并发执行任务时,确保数据的一致性和正确性。本文将详细探讨“线程间通信方式2:参数传递方式”,并通过对不同创建线程方法的分析,展示如何有效地传递参数。 ...

    Windows 2000线程间通信

    【Windows 2000线程间通信】是操作系统中的一种机制,允许同一进程或不同进程的线程之间进行信息交换。这一通信机制基于Windows 2000提供的内核对象,包括文件、文件映射、邮件槽和命名管道等多种方式。其中,文件和...

    C#线程间通信

    采用的是C#的Winform开发,提供了两种线程交互的方式。 第一:在主线程中开启两个子线程,子线程用事件方式来进行通信。对于主线程的控件操作采用的是delegate委托的方式,避免主线程假死。 第二:采用的是...

    Qt线程之间通信、线程和进程之间通信实例

    本实例将深入探讨Qt如何实现线程间通信以及线程与进程间通信,并提供简单易懂的代码示例。 一、Qt线程间通信 Qt通过信号和槽机制,使得线程间的通信变得直观且易于理解。信号是对象状态变化的通知,而槽是响应这些...

    多线程之间的线程通信

    "多线程之间的线程通信"是确保多个线程协同工作、避免数据不一致性和提高程序效率的关键概念。在本话题中,我们将深入探讨线程通信的原理、方法,以及潜在的危险。 首先,线程通信是指在一个进程中,不同的线程之间...

    C例子:线程间通信

    该程序是我写的博客“一起talk C栗子吧(第一百一十一回:C语言实例--线程间通信)”的配套程序,共享给大家使用

    android 线程间通信

    ### Android线程间通信详解 #### 一、引言 Android应用程序通常运行在单个主线程上,称为“主线程”或“UI线程”。为了提高应用性能和用户体验,开发者经常需要利用多线程技术来执行后台任务,比如下载图片、获取...

    创建线程及线程间通信

    线程通信是线程协作完成任务的关键,它允许线程之间交换数据或同步操作。一种常见的通信机制是“生产者-消费者”模型,其中生产者线程生成数据,而消费者线程消费这些数据。在没有适当的同步机制下,可能会出现数据...

    Android线程间通信的Message机制

    Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制Android线程间通信的Message机制

    android 线程间通信显示同步时间

    在Android应用开发中,线程间通信是必不可少的技能,特别是在涉及到UI更新和后台任务执行时。本主题将深入探讨如何在Android中实现线程间通信,并以显示同步时间为例,展示具体的操作流程。 首先,Android系统是...

    Handler实现线程间通信机制的原理

    文档详细介绍了Handler实现线程间通信过程中源码的实现机制,并对其中的Looper,MessageQueue,Message对象的初始化及sendMessage()通过sendMessageDelayed()和sendMessageAtTime()过程的操作机流程

    Qt线程间通信,线程控制界面显示

    Qt框架提供了一套强大的线程支持,使得开发者能够在不同线程间进行安全、高效的通信,同时保持界面的流畅更新。本文将深入探讨“Qt线程间通信,线程控制界面显示”这一主题。 首先,理解Qt中的线程模型是非常重要的...

    线程间通信求和逆序源代码

    在IT行业中,线程间通信(Inter-Thread Communication, ITC)是多线程编程中的一个关键概念。当一个程序包含多个并发执行的线程时,线程间通信用于协调它们之间的活动,确保数据的一致性和正确性。在这个场景中,...

    线程的几种控制方式以及线程间的几种通信方式

    4. **线程间通信**:线程间通信允许线程之间交换信息,Java提供了多种机制,如`wait()`, `notify()`, `notifyAll()`,Python中则有`Condition`对象。 5. **线程休眠**:Java的`Thread.sleep()`方法可以让线程暂停...

    Android中线程间通信.pdf

    ### Android中线程间通信详解 #### 一、引言 在Android开发中,线程间的通信是一项重要的技术。为了确保应用的响应性和流畅性,开发者必须了解如何正确地管理和同步多个线程之间的数据交换。本文将深入探讨Android...

Global site tag (gtag.js) - Google Analytics