|
|
不同线程间进行通信通常有两种简单方法:
方法一 通过访问共享变量的方式(注:需要处理同步问题)
方法二 通过管道流
其中方法一有两种实现方法,即
方法一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(); } } } |
|