关于“Java线程间通讯的一些方法总结”的攻略,我从以下几点进行详细讲解:
一、线程间通讯的基本概念
1. 定义
线程间通讯指的是多个线程之间相互发送信息(数据)的行为。每个线程需要知道其他线程的存在以及如何与其他线程进行通信。
2. 通讯方法
实现线程间通讯的方法有以下几种:
- 共享变量
- 管道通信
- 消息队列
- 信号量
- 事件(条件)
二、共享变量的线程间通讯
1. 概念
共享变量方法的基本思路就是让不同的线程共享同一个变量,这样一个线程在操作共享变量时,另外一个线程就可以通过读取这个变量来获取信息。
2. 示例
public class ThreadA extends Thread{
private volatile int count;//使用volatile关键字保证变量的可见性
@Override
public void run(){
while(count < 10){
count++;
System.out.println("ThreadA:Count=" + count);
}
}
}
public class ThreadB extends Thread{
private ThreadA thread;
public ThreadB(ThreadA thread){
this.thread = thread;
}
@Override
public void run(){
while(thread.count < 10){}
System.out.println("ThreadB:Count=" + thread.count);
System.out.println("ThreadB exit.");
}
}
public class Main {
public static void main(String[] args) {
ThreadA threadA = new ThreadA();
ThreadB threadB = new ThreadB(threadA);
threadA.start();
threadB.start();
}
}
在以上代码中,我们定义了一个共享变量count,两个线程通过操作这个变量来进行通信。ThreadA负责递增count直到count=10,ThreadB每隔一段时间检查count是否等于10,当count等于10时输出count,然后退出。
三、管道通信
1. 概念
管道通信指的是通过一个管道(管子)来进行通信。Java中可以通过PipedOutputStream和PipedInputStream来实现管道通信。
2. 示例
public class Sender extends Thread{
private PipedOutputStream out = new PipedOutputStream();
public PipedOutputStream getOutput(){
return out;
}
@Override
public void run(){
String message = "Hello World";
try{
out.write(message.getBytes());
out.flush();
out.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
public class Receiver extends Thread{
private PipedInputStream in = new PipedInputStream();
public void setInput(PipedInputStream in){
this.in = in;
}
@Override
public void run(){
try{
byte[] buffer = new byte[1024];
int len = in.read(buffer);
String message = new String(buffer, 0, len);
System.out.println("Receive message: " + message);
in.close();
} catch(Exception e){
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) {
Sender s = new Sender();
Receiver r = new Receiver();
try{
PipedInputStream in = new PipedInputStream(s.getOutput());
r.setInput(in);
} catch(IOException e){
e.printStackTrace();
}
s.start();
r.start();
}
}
在以上代码中,我们定义了一个管道的发送者(Sender)和接收者(Receiver),在发送者中将数据写入管道,接收者从管道中读取数据,两个线程之间实现了通讯。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java线程间通讯的一些方法总结 - Python技术站