[java][高级]Java线程间通信

admin2024-09-05  13

/*
线程间的通信
多个线程在处理同一个资源,但是任务却不相同
*/

class Resource {

  private String name;
  private String sex;
  private boolean flag = false;

  public synchronized void set(String name, String sex) {
    if (flag) try {
      this.wait();
    } catch (InterruptedException e) {}
    this.name = name;
    this.sex = sex;
    flag = true;
    this.notify();
  }

  public synchronized void out() {
    if (!flag) try {
      this.wait();
    } catch (InterruptedException e) {}
    System.out.println(name + "````````" + sex);
    flag = false;
    this.notify();
  }
}

class Input implements Runnable {

  Object obj = new Object();
  Resource r;

  Input(Resource r) {
    this.r = r;
  }

  public void run() {
    int x = 0;
    while (true) {
      if (x == 0) {
        r.set("mike", "nan");
      } else {
        r.set("丽丽", "女女女女");
      }
      x = (x + 1) % 2;
    }
  }
}

class Output implements Runnable {

  Resource r;

  Output(Resource r) {
    this.r = r;
  }

  public void run() {
    while (true) {
      r.out();
    }
  }
}

class ResourceDemo {

  public static void main(String[] args) {
    Resource r = new Resource();
    Input in = new Input(r);
    Output out = new Output(r);
    Thread t1 = new Thread(in);
    Thread t2 = new Thread(out);
    t1.start();
    t2.start();
  }
}

        这段代码是一个简单的Java程序,它演示了线程间的通信。程序中定义了一个名为Resource的类,它包含了一些私有成员变量和一个同步方法set以及一个同步方法outset方法用于设置资源的名称和性别,而out方法用于输出资源的信息。

        Input类实现了Runnable接口,它代表一个输入线程,负责设置资源的值。Output类也实现了Runnable接口,它代表一个输出线程,负责打印资源的信息。

        在ResourceDemo类的main方法中,创建了Resource对象和两个线程对象t1t2t1线程用于执行Input类的run方法,而t2线程用于执行Output类的run方法。这两个线程分别代表不同的任务,它们通过Resource对象进行通信。

        程序的关键点在于waitnotify方法的使用。当set方法被调用时,如果flagtrue,表示资源已经被占用,那么调用wait方法会使当前线程等待,直到其他线程调用notify方法。当out方法被调用时,如果flagfalse,表示资源未被占用,那么调用wait方法也会使当前线程等待,直到其他线程调用notify方法。

   flag变量用于标记资源是否被占用。当资源被设置后,flag被设置为true,并且调用notify方法唤醒等待的线程。当资源被输出后,flag被设置为false,并且调用notify方法唤醒等待的线程。

        这个程序的目的是演示线程同步和通信的基本机制,但它在实际应用中可能存在一些问题,比如死锁和资源竞争。在实际开发中,需要根据具体情况设计更健壮的线程同步机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!