java线程间通讯的一些方法总结

关于“Java线程间通讯的一些方法总结”的攻略,我从以下几点进行详细讲解:

关于“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线程间通讯的一些方法总结

基础教程推荐