在条件下停止等待线程

时间:2016-02-27 04:59:47

标签: java multithreading

我正在学习多线程。我正在实施生产者和消费者问题。我被困在我想要的情况下,当我按下除键盘整数以外的任何东西时,我的所有线程都应该死掉并且线程没有使用内存。请提供宝贵意见,帮助我实现目标。以下是我正在使用的所有代码。

包com.java.concurrency;

    public class ThreadSignaling {
      private int i = -1;
      private boolean valueSet = false;
      private boolean stopFlag = false;

      public void put(int value) {
        synchronized (this) {
          while (valueSet) {
            if (stopFlag) {
              System.out.println("Byeeeeeeeeeeeee");
              break;
            }
            try {
              this.wait();
            } catch (InterruptedException e) {
              System.out.println("InterruptedException while waiting in put() : " + e);
            }
          }
          this.i = value;
          this.valueSet = true;
          System.out.println("Value put : " + this.i);
          this.notify();
        }
      }

      public void get() {
        synchronized (this) {
          while (!valueSet) {
            if (stopFlag) {
              System.out.println("Byeeeeeeeeeeeee");
              break;
            }
            try {
              this.wait();
            } catch (InterruptedException e) {
              System.out.println("InterruptedException while waiting in get() : " + e);
            }
          }
          System.out.println("Value get : " + this.i);
          valueSet = false;
          this.notify();
        }
      }

      public void finish() {
        synchronized (this) {
          stopFlag = true;
          this.notifyAll();
        }
      }

    }

    public class Producer implements Runnable {
  private ThreadSignaling sharedObj = null;
  private final Scanner input = new Scanner(System.in);

  public Producer(ThreadSignaling obj) {
    this.sharedObj = obj;
  }

  @Override
  public void run() {
    int value = -1;
    System.out.println("Press Ctrl-c to stop... ");
    while (true) {
      System.out.println("Enter any integer value : ");
      if (input.hasNextInt()) {
        value = input.nextInt();
      } else {
        this.sharedObj.finish();
        return;
      }
      this.sharedObj.put(value);
      try {
        Thread.sleep(500);
      } catch (InterruptedException e) {
        System.out.println("InterruptedException while sleeping" + e);
      }
    }
  }
}
public class Consumer implements Runnable {
  private ThreadSignaling sharedObj = null;

  public Consumer(ThreadSignaling obj) {
    this.sharedObj = obj;
  }

  @Override
  public void run() {
    while (true) {
      this.sharedObj.get();
    }
  }
}
public class MainThread {

  public static void main(String[] args) {
    ThreadSignaling sharedObj = new ThreadSignaling();
    Producer in = new Producer(sharedObj);
    Consumer out = new Consumer(sharedObj);
    Thread t1 = new Thread(in);
    Thread t2 = new Thread(out);
    t1.start();
    t2.start();
  }
}    enter code here

1 个答案:

答案 0 :(得分:0)

您的代码存在的问题是您没有Consumer的退出条件。消费者的run()方法将永远运行,同时对共享对象执行重复get次调用。 您需要做的是让Producer知道Producer在共享对象中设置了stopFlag。如果stopFlag为真,那么消费者中的循环也应该完成。有几种方法可以做到这一点:

  • 重新定义get方法以返回stopFlag;
  • 的值
  • 定义一个新方法,只返回stopFlag;
  • 的值

在任何一种情况下,在Consumer.run()中进行测试,如果值为true,只需返回以便无限循环结束。