我想让两个线程同时运行,互不干扰,而且要把线程1中的数据传给线程2,
如何实现呢?

解决方案 »

  1.   

    java对线程间的通讯有专门的IO支持。
    管道流 PipedInputStream,PipdedOutputStream,PipedReader,PipedWriter可以用于通信,具体的可以看Think in java 的 并发 部分或者是 JDK里自己去查。
      

  2.   

    我可以向您提供以下几种方法:
    1.建立一个自己的管道:方法很简单,生成一个共享文件,并且利用线程1去写,利用线程2去读以实现通信,其中写操作和读操作均需要放在定时器中,例如每1秒执行一次。具体读写文件操作就不用我多说了吧(这种方法适用于java应用程序和其它应用程序间的通信,非常好用)。
    2.可以利用管道流PipedInputStream和PipedOutPutStream实现,具体请参阅Java API
      

  3.   

    管道流的实例:import java.io.*;
    public class E8_15{
    //管道流的应用
    public static void main(String args[]){
    PipedOutputStream pos=new PipedOutputStream();
    PipedInputStream pis=new PipedInputStream() ;
    try{
    pis.connect(pos);//连接管道
    }catch(IOException e){
    System.out.println(e);
    }
    Thread1 t1=new Thread1(pos);
    Thread2 t2=new Thread2(pis);
    t1.start();
    t2.start();

    }

    }
    //线程1,用来发送消息。把数据输出到管道
    class Thread1 extends Thread{
    private DataOutputStream dos ;
    public Thread1(PipedOutputStream pos){
    dos=new DataOutputStream(pos);
    }
    public void run(){
    System.out.println("发送消息,请接收:");
    String s=new String("线程2,你好吗?");
    try{
    dos.writeUTF(s);
    dos.close();
    }catch(IOException e){
    System.out.println(e);
    }
    }
    }
    //线程2,用来接收消息,从管道接收数据
    class Thread2 extends Thread{
    private DataInputStream dis ;
    public Thread2(PipedInputStream pis){
    dis=new DataInputStream(pis);
    }
    public void run(){
    String s=null;
    try{
    s=dis.readUTF();
    System.out.println("从线程1接收到的消息是:"+s);
    dis.close();
    }catch(IOException e){
    System.out.println(e);
    }
    }
    }
    上例的输出是:
    发送消息,请接收:
    从线程1接收到的消息是:线程2,你好吗?
      

  4.   

    在上面的例子里,我们使用了PipedOutputStream和PipedInputStream。因为它们是字节流,所以还借助了DataInputStream和DataOutputStream来进行字符的读写,当然也可以用管道流的read和write方法,只不过每次处理是以字节为单位,稍微麻烦一些。对于处理字符的情况,java.io包也提供了字符管道流。它们就是PipedWriter和PipedReader。我们用这两个字符管道流把上例改造成下面的等效代码。
    【例8-16】
    import java.io.*;
    public class E8_16{
    //管道流的应用
    public static void main(String args[]){
    PipedReader pr=new PipedReader();
    PipedWriter pw=new PipedWriter() ;
    try{
    pr.connect(pw);//连接管道
    }catch(IOException e){
    System.out.println(e);
    }
    Thread1 t1=new Thread1(pw);
    Thread2 t2=new Thread2(pr);
    t1.start();
    t2.start();

    }

    }
    //线程1,用来发送消息。把数据输出到管道
    class Thread1 extends Thread{
    private PipedWriter pw ;
    public Thread1(PipedWriter pw){
    this.pw=pw;
    }
    public void run(){
    System.out.println("发送消息,请接收:");
    String s=new String("线程2,你好吗?");
    try{
    pw.write(s);//把字符串写到管道里
    pw.close();
    }catch(IOException e){
    System.out.println(e);
    }
    }
    }
    //线程2,用来接收消息,从管道接收数据
    class Thread2 extends Thread{
    private PipedReader pr ;
    public Thread2(PipedReader pr){
    this.pr=pr;
    }
    public void run(){
    int i=0;
    char c=0;
    try{
    //读取管道中的字符
    while((i=pr.read())!=-1)
    System.out.print((char)i);
    System.out.println();
    pr.close();
    }catch(IOException e){
    System.out.println(e);
    }
    }
    }