`

线程通信 两种简单方法

阅读更多

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

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

Java代码 复制代码
/**
 * 通过内部类实现线程的共享变量
 *
 */
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接口实现线程的共享变量
代码如下

Java代码 复制代码
  1. /**   
  2. * 通过实现Runnable接口实现线程的共享变量   
  3. * @author Administrator   
  4.  
  5. */    
  6. public class Interfacaesharethread {    
  7. public static void main(String[] args) {    
  8. Mythread mythread = new Mythread();    
  9. new Thread(mythread).start();    
  10. new Thread(mythread).start();    
  11. new Thread(mythread).start();    
  12. new Thread(mythread).start();    
  13. }    
  14. }    
  15.   
  16. /* 实现Runnable接口 */    
  17. class Mythread implements Runnable {    
  18. int index = 0;    
  19.   
  20. public synchronized void run() {    
  21. while (true)    
  22. System.out.println(Thread.currentThread().getName()    
  23. "is running and the index is " + index++);    
  24. }    
  25. }   
/** 
* 通过实现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++); 
} 
} 


方法二:
代码如下

Java代码 复制代码
  1. import java.io.IOException;    
  2. import java.io.PipedInputStream;    
  3. import java.io.PipedOutputStream;    
  4.   
  5. public class CommunicateWhitPiping {    
  6. public static void main(String[] args) {    
  7. /**   
  8. * 创建管道输出流   
  9. */    
  10. PipedOutputStream pos = new PipedOutputStream();    
  11. /**   
  12. * 创建管道输入流   
  13. */    
  14. PipedInputStream pis = new PipedInputStream();    
  15. try {    
  16. /**   
  17. * 将管道输入流与输出流连接   
  18. * 此过程也可通过重载的构造函数来实现   
  19. */    
  20. pos.connect(pis);    
  21. catch (IOException e) {    
  22. e.printStackTrace();    
  23. }    
  24. /**   
  25. * 创建生产者线程   
  26. */    
  27. Producer p = new Producer(pos);    
  28. /**   
  29. * 创建消费者线程   
  30. */    
  31. Consumer c = new Consumer(pis);    
  32. /**   
  33. * 启动线程   
  34. */    
  35. p.start();    
  36. c.start();    
  37. }    
  38. }    
  39.   
  40. /**   
  41. * 生产者线程(与一个管道输入流相关联)   
  42.  
  43. */    
  44. class Producer extends Thread {    
  45. private PipedOutputStream pos;    
  46. public Producer(PipedOutputStream pos) {    
  47. this.pos = pos;    
  48. }    
  49. public void run() {    
  50. int i = 8;    
  51. try {    
  52. pos.write(i);    
  53. catch (IOException e) {    
  54. e.printStackTrace();    
  55. }    
  56. }    
  57. }    
  58.   
  59. /**   
  60. * 消费者线程(与一个管道输入流相关联)   
  61.  
  62. */    
  63. class Consumer extends Thread {    
  64. private PipedInputStream pis;    
  65. public Consumer(PipedInputStream pis)    
  66. {    
  67. this.pis = pis;    
  68. }    
  69. public void run() {    
  70. try {    
  71. System.out.println(pis.read());    
  72. catch (IOException e) {    
  73. e.printStackTrace();    
  74. }    
  75. }    
  76. }   
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(); 
} 
} 
} 
分享到:
评论

相关推荐

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

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

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

    本文将深入探讨计算机网络中的多线程通信,以Java编程语言为例,结合"MT_WebServer"这一文件,来阐述如何实现一个简单的多线程Web服务器。 首先,多线程是操作系统中并发执行的两个或多个线程,它们共享同一内存...

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

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

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

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

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

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

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

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

    qt 中 多线程tcp通信

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

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

    本文将详细探讨“线程间通信方式2:参数传递方式”,并通过对不同创建线程方法的分析,展示如何有效地传递参数。 1. **线程创建方法** 在Windows API中,我们通常使用以下三种方法创建线程: - **CreateThread...

    Android(Java)线程的两种实现方式

    有时,结合使用这两种方式可以达到更好的效果,比如使用`AsyncTask`(内部使用了`Thread`和`Handler`),它提供了一种更为简便的异步处理方式,适合执行耗时但需要回调结果的短任务。 总的来说,理解和熟练掌握...

    Android 线程thread的两种实现方法(必看)

    这两种方法都可以结合`Handler`来实现后台线程与主线程之间的通信。在实际开发中,根据具体需求选择合适的方式是非常重要的,比如考虑代码的可维护性、扩展性和避免内存泄漏等问题。理解并熟练掌握线程和`Handler`...

    网络通信之Java Socket多线程通信.pdf

    Java Socket 多线程通信技术 Java Socket 通信技术是网络通信的关键技术之一。通过实现一个简单的服务端、客户端聊天程序,文章对 Java Socket 通信技术的原理和实现进行了详细的介绍。 网络通信设计 网络通信...

    深入浅出Win32多线程程序设计之线程通信.doc

    全局变量是最简单的线程通信方式,因为它们对进程内的所有线程可见。然而,直接使用全局变量进行同步通常会导致效率低下,比如在示例代码中,主线程通过不断检查全局变量`globalFlag`的值来等待子线程完成,这种方式...

    单线程与多线程socket通信

    本项目涵盖了单线程和多线程两种方式的Socket通信实现,帮助开发者理解这两种模式的差异和应用场景。 首先,我们来详细探讨单线程Socket通信。在单线程模型中,服务器端只有一个线程处理所有客户端的连接请求。当一...

    基于VC_的多线程通信程序设计.

    基于VC++的多线程通信程序设计是一种在软件开发领域广泛应用的技术,特别是在Windows平台上,它能够显著提升程序的性能和响应速度。本文将深入探讨基于VC++的多线程通信程序设计的关键概念、技术细节以及实际应用...

    简单C/S通信进程线程实现

    1. **C/S架构**:C/S架构是Client/Server(客户端/服务器)的缩写,它定义了一种两层或多层的应用程序结构。在该结构中,客户端发起请求,服务器端处理请求并返回结果。 2. **进程通信**:进程是操作系统资源分配的...

    采用全局变量方式实现多线程的通信

    总的来说,全局变量在实现多线程通信时提供了一种简单但不总是最佳的途径。在实际开发中,我们需要根据项目需求和性能考虑,谨慎选择适合的线程同步和通信机制。MFC提供了丰富的工具和类来帮助我们处理这些问题,但...

    android 线程间通信

    ### Android线程间通信详解 #### 一、引言 Android应用程序通常运行在单个主线程上,称为“主线程”或“UI线程”。...合理运用这两种机制,可以有效解决多线程环境中UI更新的问题,从而提高应用的性能和用户体验。

    Java线程间的通信方式详解

    本文将详细介绍两种常见的Java线程通信方式:同步和while轮询。 1. 同步(Synchronized) 同步是Java中控制线程并发的一种手段,它通过`synchronized`关键字实现。在Java中,同步主要有两种形式:同步方法(通过在...

    ios多线程开发的常用四种方式和基本使用

    开发者可以通过创建NSThread对象并调用其start方法来启动一个新线程。NSThread的使用较为简单,但不支持自动管理线程优先级和资源,因此需要开发者手动控制线程的生命周期。 NSOperation和NSOperationQueue是Apple...

Global site tag (gtag.js) - Google Analytics