`

线程通信 两种简单方法

阅读更多

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

其中方法一有两种实现方法,即
方法一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创建线程的两种方式+线程池方式

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

    多线程通信

    Java是一种可用于进行网络编程的语言,它提供了两种功能强大的网络支持机制:URL访问网络资源的类和用Socket通讯的类,来满足不同的要求。一是URL用于访问Internet网上资源的应用;另一种是针对client/server(客户端...

    C#线程锁介绍源码

    比如,最简单的情况是,一个计数器,两个线程 同时加一,后果就是损失了一个计数,但相当频繁的锁定又可能带来性能上的消耗,还有最可怕的情况死锁。那么什么情况下我们需要使用锁,什么情况下不需要 呢? 1)只有...

    Linux系统编程之线程同步

    【作业】:编写程序,实现上述两种死锁现象。 读写锁 与互斥量类似,但读写锁允许更高的并行性。其特性为:写独占,读共享。 读写锁状态: 一把读写锁具备三种状态: 1. 读模式下加锁状态 (读锁) 2. ...

    Android使用多线程进行网络聊天室通信

    TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信了。Java对基于TCP协议的网络通信...

    用WIN32API函数实现Windows下的串行通讯

     在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口...

    linux系统编程之线程.zip

    在不同的系统中thread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用pthread_self(3)可以获得当前线程的id。 attr参数表示线程属性...

    python多线程与多进程及其区别详解

    本文通过一些具体的例子简单介绍一下python的多线程和多进程,后续会写一些进程通信和线程通信的一些文章。 python多线程 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持...

    python多线程与多进程及其区别

    本文通过一些具体的例子简单介绍一下python的多线程和多进程,后续会写一些进程通信和线程通信的一些文章。 python中提供两个标准库thread和threading用于对线程的支持,python3中已放弃对前者的支持,后者是一种更...

    win32串口编程 ACTIVEX api 均有

    在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序 Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍 串口的操作可以有两种操作方式:同步...

    联通SGIP1.2短信网关 发送接收短信皆可 可以应对高并发

    实际是接收联通短信中心SMG发过来的信息,为了应对高并发的场景,使用了生产者和消费者典型的多线程设计方案,用线程池去管理多线程,需要改动相关代码,找到类SCIPServer修改即可,接收短信的方式有两种一种是Socket,一种...

    java面试宝典

    237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、...

    Android中使用开源框架eventbus3.0实现fragment之间的通信交互

    在之前的博文中简单介绍过如何实现fragment之间的信息交互:《Android中Fragment与Activity之间的交互(两种实现方式)》,今天继续给大家介绍一种可以实现此效果的另外一种方式EventBus。(相比于handler,接口回调...

    千方百计笔试题大全

    237、触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    超级有影响力霸气的Java面试题大全文档

     Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...

    面向大规模科学计算的CPU-GPU异构并行技术研究

    和长流分段两种方法,从不同角度优化CPU.GPU的通信过程。其次,针对AMD GPU硬件及其编程模型Brook+的特性,本文提出了四种面向GPU的并行优化策 略,包括平衡线程并行性和局部性、分支消除、开发指令级并行和提高...

    electron + vue项目实现打印小票功能及实现代码

    electron打印大概有两种: 第一种:通过window的webcontent对象,使用此种方式需要单独开出一个打印的窗口,可以将该窗口隐藏,但是通信调用相对复杂。 第二种:使用页面的webview元素调用打印,可以将webview隐藏...

Global site tag (gtag.js) - Google Analytics