java - 线程中的阻塞方法

标签 java multithreading

我正在尝试开发一个国际象棋游戏计时器。 应该有一个类似的功能

等待用户输入从控制台移动

如果等待时间> 60

停止等待,继续前进。

我能想到的解决这个问题的方法是使用 Thread ,例如:

public class Game {
  Thread t1 = new PlayDisc(this);
  Thread t2 = new Timer(this);

  public static void main(String[] args) {
    t1.start();
    t2.start();
  }
}


public class Timer extends Thread{
   Game g;


  public Timer(Game g) {
    this.g = g;
  }

@Override
  public void run() {
    int i = 0;
    while(true){
      if(i > 6000) {
        g.t1.interrupt();
        break;
      }
    }
  }
}

public class PlayDisc extends Thread{
  private Game g;

  public PlayDisc(Game g) {
    this.g = g;
  }

  @Override
  public void run() {
    Scanner s = new Scanner(System.in);

    int x = s.nextInt();
    int y = s.nextInt();

    Point p = new Point(x, y);
    cm.nextPoint = p;
    s.close();
  }


}

我知道这不起作用,因为 Scanner.nextInt() 是一种阻塞方法。但我需要从命令行读取输入。 有什么办法可以解决这个问题吗?

最佳答案

已经有一个 Timer 类(实际上是两个,java.util.Timerjavax.swing.Timer)。但正如您所意识到的,nextInt() 的阻塞性质会阻止您在超时后执行任何操作。您将需要一个额外的库,它可以为您提供比 Java 默认情况下更好的控制台控制。或者使用 Swing

编辑:通过使用 hasNextInt() 的轮询循环,可能可以执行某种黑客攻击。这样你就不会让扫描线程阻塞。

重新编辑:不,这是不可能的,因为 hasNext() 会阻塞。您必须测试中断是否能让您摆脱这里的麻烦(可能不会)。

关于java - 线程中的阻塞方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23602525/

相关文章:

java - 将图像从文件夹拖放到 JTextPane

java - 连续if和嵌套if有什么区别?

java - GridLayout 中的 JTextField

Java:在 'run'类中私下调用 'Runnable'

ios - 与核心音频线程同步

java - 可运行崩溃中的 HTTPPost

java - 当 Spring 看到 <task :annotation-driven/> in a webapp what contexts are checked?

java - 无法加载 JDBC 驱动程序类 - Spring Batch 独立程序

c++ - shared_timed_mutex 在 OS X 10.11.2 上不可用?

Python Threading.Timer正在调用命令而无需等待