A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 吴超 于 2012-5-28 23:05 编辑
  1. 如何实现在等待时间内,控制台无法输入
复制代码
  1. package com.itcast.day15;

  2. import java.util.Scanner;
  3. import java.util.Timer;
  4. import java.util.TimerTask;

  5. /*
  6. *  需求:
  7. *         我有一个账号和密码都是:admin
  8. *
  9. *  我从键盘输入账号和密码,如果成功,则提示登录成功,结束程序
  10. *  如果我输入的次数超过3次,则提示账号被冻结,并退出系统 System.exit(0);
  11. */
  12. public class StringDemo3 {

  13.         /**
  14.          * @param args
  15.          */
  16.         static int cishu = 3;// 帐号次数
  17.         static int sum = 3;// 密码输入次数

  18.         public static void main(String[] args) {

  19.                 // TODO Auto-generated method stub
  20.                 String ID = "admin";
  21.                 String password = "admin";

  22.                 show(ID, password);
  23.         }

  24.         public static void show(String ID, String password) {
  25.                 // 判断密码条件
  26.                 Scanner scanner = new Scanner(System.in);
  27.                 for (int m = cishu; m > 0;) {
  28.                         System.out.println("请输入你的账号");
  29.                         String st1 = scanner.nextLine();
  30.                         // 判断帐号是否符合
  31.                         if (ID.compareTo(st1) == 0) {

  32.                                 for (int i = sum; i > 0;) {
  33.                                         System.out.println("请输入您的密码");
  34.                                         String st2 = scanner.nextLine();
  35.                                         // 判断密码是否符合
  36.                                         if (password.compareTo(st2) == 0) {
  37.                                                 System.out.println("登陆成功");
  38.                                                 System.exit(0);
  39.                                         } else {

  40.                                                 i--;// 如果输入次数超过,退出
  41.                                                 if (i == 0) {
  42.                                                         System.out.println("账号被冻结,请携带身份证去所在银行解冻");
  43.                                                         System.exit(0);

  44.                                                 }
  45.                                                 // 继续循环
  46.                                                 System.out.println("还有" + i + "次机会");
  47.                                                 continue;
  48.                                         }
  49.                                 }

  50.                         } else {
  51.                                 m--;
  52.                                 if (m != 0) {
  53.                                         System.out.println("密码不正确,请重新输入");
  54.                                 } else {
  55.                                         System.out.println("输入帐号错误,请稍后再试");
  56.                                         // System.exit(0);
  57.                                         System.out.println("请过5秒,再来登录");
  58.                                         /*
  59.                                          * Timer t = new Timer(); //
  60.                                          * 执行时间,创建tiemr,构造timertask,并实现run方法 t.schedule(new
  61.                                          * TimerTask() { public void run() {
  62.                                          * System.out.println("系统繁忙"); } }, 1000 * 5); //cishu=5;
  63.                                          * m=3;
  64.                                          */
  65.                                         // 如何解决等待时间问题
  66.                                         // BUG,输入会出现延迟,不知道如何解决
  67.                                         /*
  68.                                          * System.out.println("请过xx时间,再来登录"); try {
  69.                                          *
  70.                                          *
  71.                                          * (InterruptedException e) { // TODO Auto-generated catch
  72.                                          * block e.printStackTrace(); }
  73.                                          *
  74.                                          * 难道要用文本?dis****
  75.                                          */
  76.                                         /*
  77.                                          * try { Thread.sleep(5000); } catch (InterruptedException
  78.                                          * e) {
  79.                                          *
  80.                                          * e.printStackTrace(); } m=3; continue;
  81.                                          */
  82.                                 }

  83.                         }

  84.                 }
  85.         }

  86. }
复制代码

QQ截图20120527214809.jpg (32.25 KB, 下载次数: 179)

QQ截图20120527214809.jpg

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

29 个回复

正序浏览

回帖奖励 +1 黑马币

这段代码我得研究一会儿
回复 使用道具 举报
               
回复 使用道具 举报
来看看,有奖励吗
回复 使用道具 举报
问题是这样的,我希望输入密码错误超过指定次数后,让程序停在那
时间到了,才能输入
回复 使用道具 举报
学习了!
回复 使用道具 举报
龚正军 发表于 2012-5-31 02:46
多数情况都是输入次数到达后,就自动停止登录动作这类要求来得多吧??

楼主这样要求输入3次错误后还要求 ...

呵呵   :P
回复 使用道具 举报
刘蕴学 发表于 2012-5-30 23:15
我的想法是一种休眠主线程,一种用前台线程达到条件死锁,之后用守护线程在规定时间之后唤醒他

还有一种办 ...

试过很多办法,或许这涉及到底层,无法让控制台停止输入,即使sleep,在控制台随便按,虽然在限制时间没效果,但是,过了时间,依旧会出现之前按的

点评

不过貌似这种也达不到秒杀控制台的办法,关闭输入流?让控制台wait?我这边没忙的要死,忙完了给你试试  发表于 2012-6-2 00:18
你试试控制台类System.console().reader();和writer方法的流来输入输出,别直接用in 和out  发表于 2012-6-2 00:15
回复 使用道具 举报
Akm 发表于 2012-5-30 19:20
突然看到这还是 有奖励分的帖子 这楼主太坑人了也  中奖概率才 10% 。。。比中彩票的概率都低。。。。[qq]1 ...

比中彩票的概率都低。。。。
同感!
回复 使用道具 举报

回帖奖励 +1 黑马币

小手一抖 金币到手
回复 使用道具 举报
黄秋 黑马帝 2012-5-31 02:50:43
21#
  1. import java.util.Scanner;
  2. import java.util.Timer;
  3. import java.util.TimerTask;

  4. /*
  5. *  需求:
  6. *         我有一个账号和密码都是:admin
  7. *
  8. *  我从键盘输入账号和密码,如果成功,则提示登录成功,结束程序
  9. *  如果我输入的次数超过3次,则提示账号被冻结,并退出系统 System.exit(0);
  10. */
  11. public class Test {

  12.         /**
  13.          * @param args
  14.          */
  15.         static int cishu = 3;// 帐号次数
  16.         static int sum = 3;// 密码输入次数

  17.         public static void main(String[] args) {

  18.                 // TODO Auto-generated method stub
  19.                 String ID = "admin";
  20.                 String password = "admin";

  21.                 show(ID, password);
  22.         }

  23.         public static void show(String ID, String password) {
  24.                 // 判断密码条件
  25.                 Scanner scanner = new Scanner(System.in);
  26.                 for (int m = cishu; m > 0;) {
  27.                         System.out.println("请输入你的账号");
  28.                         String st1 = scanner.nextLine();
  29.                         // 判断帐号是否符合
  30.                         if (ID.compareTo(st1) == 0) {

  31.                                 for (int i = sum; i > 0;) {
  32.                                         System.out.println("请输入您的密码");
  33.                                         String st2 = scanner.nextLine();
  34.                                         // 判断密码是否符合
  35.                                         if (password.compareTo(st2) == 0) {
  36.                                                 System.out.println("登陆成功");
  37.                                                 System.exit(0);
  38.                                         } else {

  39.                                                 i--;// 如果输入次数超过,退出
  40.                                                 if (i == 0) {
  41.                                                         System.out.println("账号被冻结,请携带身份证去所在银行解冻");
  42.                                                         System.exit(0);

  43.                                                 }
  44.                                                 // 继续循环
  45.                                                 System.out.println("还有" + i + "次机会");
  46.                                                 continue;
  47.                                         }
  48.                                 }

  49.                         } else {
  50.                                 m--;
  51.                                 if (m != 0) {
  52.                                         System.out.println("帐号不正确,请重新输入");
  53.                                 } else {
  54.                                         System.out.println("输入帐号错误" + cishu + "次,请稍后再试");
  55.                                         System.out.println("请过5秒,再来登录");
  56.                                         try{Thread.sleep(5000);}catch(Exception e){}
  57.                                                                                 m =cishu;
  58.                                                                                 continue;                                                                               
  59.                                 }

  60.                         }

  61.                 }
  62.         }

  63. }
复制代码
回复 使用道具 举报
本帖最后由 龚正军 于 2012-5-31 02:48 编辑

多数情况都是输入次数到达后,就自动停止登录动作这类要求来得多吧??

楼主这样要求输入3次错误后还要求挂起并不能继续输入本身要求就有点异常(有点矛盾,你不要求继续输入了就把控制台停掉,需要继续输入再继续wait啊)。

但是要在第输入次数过后吧控制台挂起,其实相当简单:你新做一个方法(带break标记),当最后次数到的时候(用if语句判断break到标记位置就行了!!那个方法你可以做成死循环或则无线hold住都可以哦!(但我确实不清楚你这么弄的实际意义在什么地方)
回复 使用道具 举报
本帖最后由 刘蕴学 于 2012-5-30 23:17 编辑

我的想法是一种休眠主线程,一种用前台线程达到条件死锁,之后用守护线程在规定时间之后唤醒他

还有一种办法就是装饰模式,重新弄一个新的包装流,然后sleep他
回复 使用道具 举报

  1. <P> </P>
复制代码

  1. import java.util.Scanner;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class StringDemo3 {

  5. /**
  6. * @param args
  7. */
  8. static int cishu = 3;// 帐号次数
  9. static int sum = 3;// 密码输入次数

  10. public static void main(String[] args) {

  11. // TODO Auto-generated method stub
  12. String ID = "admin";
  13. String password = "admin";

  14. show(ID, password);
  15. }

  16. public static void show(String ID, String password) {
  17. // 判断密码条件
  18. Scanner scanner = new Scanner(System.in);
  19. for (int m = cishu; m > 0;) {
  20. System.out.println("请输入你的账号");
  21. String st1 = scanner.nextLine();
  22. // 判断帐号是否符合
  23. if (ID.compareTo(st1) == 0) {

  24. for (int i = sum; i > 0;) {
  25. System.out.println("请输入您的密码");
  26. String st2 = scanner.nextLine();
  27. // 判断密码是否符合
  28. if (password.compareTo(st2) == 0) {
  29. System.out.println("登陆成功");
  30. System.exit(0);
  31. } else {

  32. i--;// 如果输入次数超过,退出
  33. if (i == 0) {
  34. System.out.println("账号被冻结,请携带身份证去所在银行解冻");
  35. System.exit(0);

  36. }
  37. // 继续循环
  38. System.out.println("还有" + i + "次机会");
  39. continue;
  40. }
  41. }

  42. } else {
  43. m--;
  44. if (m != 0) {
  45. System.out.println("密码不正确,请重新输入");
  46. } else {
  47. System.out.println("输入帐号错误,请稍后再试");
  48. // System.exit(0);
  49. System.out.println("请过5秒,再来登录");




  50. try
  51. {
  52. Thread.sleep(5000);
  53. show(ID,password);
  54. }
  55. catch (Exception e)
  56. {

  57. }



  58. /*
  59. * Timer t = new Timer(); //
  60. * 执行时间,创建tiemr,构造timertask,并实现run方法 t.schedule(new
  61. * TimerTask() { public void run() {
  62. * System.out.println("系统繁忙"); } }, 1000 * 5); //cishu=5;
  63. * m=3;
  64. */
  65. // 如何解决等待时间问题
  66. // BUG,输入会出现延迟,不知道如何解决
  67. /*
  68. * System.out.println("请过xx时间,再来登录"); try {
  69. *
  70. *
  71. * (InterruptedException e) { // TODO Auto-generated catch
  72. * block e.printStackTrace(); }
  73. *
  74. * 难道要用文本?dis****
  75. */
  76. /*
  77. * try { Thread.sleep(5000); } catch (InterruptedException
  78. * e) {
  79. *
  80. * e.printStackTrace(); } m=3; continue;
  81. */
  82. }

  83. }

  84. }
  85. }

  86. }
复制代码
我就加了几句代码,不知道是不是你要的效果了,你试下。
回复 使用道具 举报
吴超 发表于 2012-5-30 22:06
呵呵,我的需求是这样,不过,需求是在我输入帐号错误超过次数的情况下 ...

那用户名输入错误超过3次了,系统挂5秒,然后又可以继续输入,那输入的次数要清0吗?
回复 使用道具 举报
Akm 发表于 2012-5-30 19:20
突然看到这还是 有奖励分的帖子 这楼主太坑人了也  中奖概率才 10% 。。。比中彩票的概率都低。。。。 ...

那不好意思了,我用的是Random类的方法
回复 使用道具 举报
Akm 发表于 2012-5-30 19:17
这个问题 应该得用到 线程方面的知识, 建议去看看 线程同步 和线程解锁 、线程休眠 等等内容 具体代码就不 ...

呵呵,我那些注释的代码用的就是,只不过用了达不到效果
回复 使用道具 举报
杨天皓 发表于 2012-5-30 19:42
你试下这段代码,不知道是不是你要的那种效果。5000毫秒,让程序挂在那里5秒钟。 ...

呵呵,我的需求是这样,不过,需求是在我输入帐号错误超过次数的情况下
回复 使用道具 举报
  1.       public static void main(String[] args)
  2.       {
  3.                         Scanner scanner = new Scanner(System.in);

  4.                         try{Thread.sleep(5000);}catch(Exception e){}

  5.                         String str = scanner.nextLine();

  6.                         System.out.println(str );
  7.       }
复制代码
你试下这段代码,不知道是不是你要的那种效果。5000毫秒,让程序挂在那里5秒钟。
回复 使用道具 举报
Akm 黑马帝 2012-5-30 19:20:24
12#
突然看到这还是 有奖励分的帖子 这楼主太坑人了也  中奖概率才 10% 。。。比中彩票的概率都低。。。。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马