`
lhx1026
  • 浏览: 306719 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

[转]线程通信的两种方法

    博客分类:
  • java
阅读更多

原文地址:

http://www.iteye.com/topic/156804

 

不同线程间进行通信通常有两种简单方法:
方法一 通过访问共享变量的方式(注:需要处理同步问题)
方法二 通过管道流

其中方法一有两种实现方法,即
方法一a)通过内部类实现线程的共享变量
代码如下:

 

/**


 * 通过内部类实现线程的共享变量


 *


 */


public class Innersharethread {


	public static void main(String[] args) {


		Mythread mythread = new Mythread();


		mythread.getThread().start();


		mythread.getThread().start();


		mythread.getThread().start();


		mythread.getThread().start();


	}


}


class Mythread {


	int index = 0;





	private class InnerThread extends Thread {


		public synchronized void run() {


			while (true) {


				System.out.println(Thread.currentThread().getName()


						+ "is running and index is " + index++);


			}


		}


	}





	public Thread getThread() {


		return new InnerThread();


	}


}

 

方法二b)通过实现Runnable接口实现线程的共享变量

 

/** 


* 通过实现Runnable接口实现线程的共享变量 


* @author Administrator 


* 


*/ 


public class Interfacaesharethread { 


public static void main(String[] args) { 


Mythread mythread = new Mythread(); 


new Thread(mythread).start(); 


new Thread(mythread).start(); 


new Thread(mythread).start(); 


new Thread(mythread).start(); 


} 


} 





/* 实现Runnable接口 */ 


class Mythread implements Runnable { 


int index = 0; 





public synchronized void run() { 


while (true) 


System.out.println(Thread.currentThread().getName() 


+ "is running and the index is " + index++); 


} 


} 

 

方法二:
代码如下

 

import java.io.IOException; 
import java.io.PipedInputStream; 
import java.io.PipedOutputStream; 

public class CommunicateWhitPiping { 
public static void main(String[] args) { 
/** 
* 创建管道输出流 
*/ 
PipedOutputStream pos = new PipedOutputStream(); 
/** 
* 创建管道输入流 
*/ 
PipedInputStream pis = new PipedInputStream(); 
try { 
/** 
* 将管道输入流与输出流连接 
* 此过程也可通过重载的构造函数来实现 
*/ 
pos.connect(pis); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
/** 
* 创建生产者线程 
*/ 
Producer p = new Producer(pos); 
/** 
* 创建消费者线程 
*/ 
Consumer c = new Consumer(pis); 
/** 
* 启动线程 
*/ 
p.start(); 
c.start(); 
} 
} 

/** 
* 生产者线程(与一个管道输入流相关联) 
* 
*/ 
class Producer extends Thread { 
private PipedOutputStream pos; 
public Producer(PipedOutputStream pos) { 
this.pos = pos; 
} 
public void run() { 
int i = 8; 
try { 
pos.write(i); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 
} 

/** 
* 消费者线程(与一个管道输入流相关联) 
* 
*/ 
class Consumer extends Thread { 
private PipedInputStream pis; 
public Consumer(PipedInputStream pis) 
{ 
this.pis = pis; 
} 
public void run() { 
try { 
System.out.println(pis.read()); 
} catch (IOException e) { 
e.printStackTrace(); 
} 
} 
} 

 

 

 

分享到:
评论

相关推荐

    多线程之间的线程通信

    在本话题中,我们将深入探讨线程通信的原理、方法,以及潜在的危险。 首先,线程通信是指在一个进程中,不同的线程之间共享数据和协调执行顺序的过程。这种通信通常涉及两个主要方面:同步和互斥。同步是为了保证...

    多线程通信ThreadDemo

    3. **线程通信方法**: - **wait() 和 notify()**:这两个方法位于`Object`类中,用于线程间同步。当一个线程调用`wait()`时,它会释放持有对象的锁并进入等待状态,直到其他线程调用该对象的`notify()`或`...

    Java 线程通信示例 源代码

    8. **CyclicBarrier 和 CountDownLatch**:这两种工具可以帮助线程等待其他线程到达某个点后再继续执行。CyclicBarrier允许多个线程在达到一个共同屏障点后一起继续,而CountDownLatch则是一次性的,计数到零后就...

    进程线程通信,线程同步,异步,进程通信经典进程间通信.7z

    **异步**和**同步**是两种不同的执行模式。同步操作意味着调用者必须等待调用的结果返回才能继续执行,而异步操作则允许调用者在等待结果时继续执行其他任务。异步编程常用于网络请求、I/O操作等耗时任务,可以提高...

    两个串口多线程通信

    本文将深入探讨“两个串口多线程通信”这一主题,结合标签“22”,我们可以理解为涉及两个串行端口在多线程环境下的通信。 串口通信,也称为RS-232通信,是计算机与设备之间进行数据交换的一种常见方式。它允许通过...

    易语言线程通信

    本文将详细探讨易语言线程通信的原理、方法以及相关API的使用。 线程是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程。在易语言中,创建线程是为了实现并发执行,提高程序效率。API_创建线程函数用于在...

    计算机网络多线程通信简例

    在计算机科学领域,尤其是软件开发中,多线程通信是一个重要的概念,特别是在处理并发任务和优化性能时。本文将深入探讨计算机网络中的多线程通信,以Java编程语言为例,结合"MT_WebServer"这一文件,来阐述如何实现...

    JAVA多线程通信学习_服务器多线程通信_

    线程通信主要依赖于共享内存和消息传递两种机制。在Java中,共享内存通常通过 volatile 关键字、synchronized 关键字和锁(如 ReentrantLock)来实现。volatile 可以确保多个线程间对变量的可见性和有序性;...

    用成员变量进行线程通信.rar_线程通信

    线程通信主要有以下几种方式: 1. **共享变量**:这是最基础的通信方式,通过修改或读取共享变量来传递信息。在Java中,使用`volatile`关键字可以确保多线程环境下的可见性和有序性,但不能解决原子性问题。 2. **...

    C#线程间通信

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

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

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

    Qt创建线程的两种方式+线程池方式

    1.方式1:继承 QThread 类方式:...两种方式的选择取决于具体的需求和设计。仅需简单的线程操作,继承 QThread 类方式可能更为简洁。如果需要更灵活的线程控制和对象交互,使用类对象的 moveToThread() 方式可能更适合

    图书管理线程通信问题

    线程通信方法主要包括以下几种: 1. **信号量(Semaphore)**:用于控制同时访问特定资源的线程数量,当资源被占用时,其他线程会等待信号量的释放。 2. **互斥量(Mutex)**:只允许一个线程访问特定资源,其他...

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

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

    vc线程通信实现计时器

    在VC++中,我们通常使用以下几种方法实现线程通信: 1. **事件对象**:如Windows的`CreateEvent`函数创建的事件,线程可以通过等待事件来同步执行。计时器功能可以通过设置事件来触发,当时间到达预设值时,计时器...

    java线程通信课程设计

    在Java中,线程通信主要通过共享内存和消息传递两种方式来实现。本课程设计旨在深入理解和实践Java线程通信机制,以提升程序的效率和并发性能。 首先,我们需要了解Java中实现线程通信的关键类和接口,如`Object`类...

    qt 中 多线程tcp通信

    首先,标题"qt 中 多线程tcp通信"表明我们要在Qt环境中实现TCP(Transmission Control Protocol)的多线程通信。TCP是一种面向连接的、可靠的传输协议,确保数据的顺序传输和错误检查。在多线程环境下,我们可以将...

    操作系统线程通信课程设计

    7. **缓冲区对类的线程通信**:缓冲区是一种常见的线程通信机制,用于临时存储数据,减少线程间的直接交互。例如,生产者-消费者模型中,生产者线程将数据放入缓冲区,消费者线程从中取出数据,通过缓冲区避免了线程...

    学习多线程之一:线程通信--利用事件对象.zip_线程通信

    线程通信的主要目的是解决两个问题:避免竞态条件和死锁。竞态条件是当多个线程同时修改同一资源,导致结果不可预测的情况。而死锁则是多个线程相互等待对方释放资源,从而陷入僵局。 在使用事件对象时,通常会有一...

    vc++ multithread多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区

    事件对象主要有两种类型:手动重置事件和自动重置事件。手动重置事件在被一个线程释放后,直到显式重置才会再次通知其他等待线程;而自动重置事件在被一个线程唤醒后,会自动重置状态,只唤醒一个等待线程。 二、...

Global site tag (gtag.js) - Google Analytics