1 线程间通信方式
1.1 共享内存
因为线程与父进程的其他线程共享该进程所拥有的全部资源。所以创建的线程本来就已经实现共享内存。但要注意的是,在操作共享资源时要注意实现同步机制,确保线程安全。
例如,通过实现Runnable接口实现线程的共享变量:
package thread;
public class RunnableTest {
public static void main(String[] args) {
RunnableThread runnableThread = new RunnableThread();
new Thread(runnableThread).start();
new Thread(runnableThread).start();
new Thread(runnableThread).start();
}
}
class RunnableThread implements Runnable{
// 多个线程之间共享num
int num = 0;
@Override
synchronized public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ":" + num++);
}
}
}
也可以通过内部类的形式来共享变量:
package thread;
/**
* 通过内部类实现线程的共享变量
*/
public class InnerShareThread {
public static void main(String[] args) {
MyThread mythread = new MyThread();
mythread.getThread().start();
mythread.getThread().start();
mythread.getThread().start();
}
}
class MyThread {
int num = 0;
private class InnerThread extends Thread {
public synchronized void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()
+ ":" + num++);
}
}
}
public Thread getThread() {
return new InnerThread();
}
}
1.2 管道流
管道流过程:生产者向管道中输出数据,消费者从管道中读取数据。当然,生产者的管道输出要与消费者的管道输入进行连接。
package thread;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class CommunicateWhitPiping {
public static void main(String[] args) {
// 创建管道输出流
PipedOutputStream pipedOutputStream = new PipedOutputStream();