黑马程序员技术交流社区

标题: 一个很有意思的问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [打印本页]

作者: 吴超    时间: 2012-5-27 22:10
标题: 一个很有意思的问题~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
本帖最后由 吴超 于 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, 下载次数: 189)

QQ截图20120527214809.jpg

作者: 吴超    时间: 2012-5-27 22:36
问题是这样的,我希望输入密码错误超过指定次数后,让程序停在那
时间到了,才能输入
作者: 吴超    时间: 2012-5-30 10:25
{:soso_e130:}自己先顶起~~~~~~~~~~~
作者: 张晨    时间: 2012-5-30 10:33
sleep一下 呵呵
作者: 吴超    时间: 2012-5-30 11:03
张晨 发表于 2012-5-30 10:33
sleep一下 呵呵

呵呵,你可把代码复制尝试下,我下面有timer和线程sleep方法
作者: 张晨    时间: 2012-5-30 11:14
你sleep只有有什么问题吗?
作者: 刘蕴学    时间: 2012-5-30 11:47
你是想控制台不能打字还是说程序挂起不进行验证?
作者: 吴超    时间: 2012-5-30 18:13
刘蕴学 发表于 2012-5-30 11:47
你是想控制台不能打字还是说程序挂起不进行验证?

需求是在帐号输入错误,超过指定次数,然后程序挂起(等待,睡眠);问题是,在控制台依旧可以输出,如何解决,或者说你有什么好的想法,共享一下
作者: 吴超    时间: 2012-5-30 18:15
张晨 发表于 2012-5-30 11:14
你sleep只有有什么问题吗?

需求是在帐号输入错误,超过指定次数,然后程序挂起(等待,睡眠);问题是,在控制台依旧可以输出,如何解决,或者说你有什么好的想法,共享一下
作者: 张晨    时间: 2012-5-30 18:30
你可以试试Thread.currentThread.sleep(5000);
作者: Akm    时间: 2012-5-30 19:17
这个问题 应该得用到 线程方面的知识, 建议去看看 线程同步 和线程解锁 、线程休眠 等等内容 具体代码就不说了 (只指路...)
作者: Akm    时间: 2012-5-30 19:20
突然看到这还是 有奖励分的帖子 这楼主太坑人了也  中奖概率才 10% 。。。比中彩票的概率都低。。。。[qq]1067703136[/qq]
作者: 杨天皓    时间: 2012-5-30 19:42
  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秒钟。
作者: 吴超    时间: 2012-5-30 22:06
杨天皓 发表于 2012-5-30 19:42
你试下这段代码,不知道是不是你要的那种效果。5000毫秒,让程序挂在那里5秒钟。 ...

呵呵,我的需求是这样,不过,需求是在我输入帐号错误超过次数的情况下
作者: 吴超    时间: 2012-5-30 22:09
Akm 发表于 2012-5-30 19:17
这个问题 应该得用到 线程方面的知识, 建议去看看 线程同步 和线程解锁 、线程休眠 等等内容 具体代码就不 ...

呵呵,我那些注释的代码用的就是,只不过用了达不到效果
作者: 吴超    时间: 2012-5-30 22:11
Akm 发表于 2012-5-30 19:20
突然看到这还是 有奖励分的帖子 这楼主太坑人了也  中奖概率才 10% 。。。比中彩票的概率都低。。。。 ...

那不好意思了,我用的是Random类的方法
作者: 杨天皓    时间: 2012-5-30 22:16
吴超 发表于 2012-5-30 22:06
呵呵,我的需求是这样,不过,需求是在我输入帐号错误超过次数的情况下 ...

那用户名输入错误超过3次了,系统挂5秒,然后又可以继续输入,那输入的次数要清0吗?
作者: 杨天皓    时间: 2012-5-30 22:24

  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 23:15
本帖最后由 刘蕴学 于 2012-5-30 23:17 编辑

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

还有一种办法就是装饰模式,重新弄一个新的包装流,然后sleep他
作者: 龚正军    时间: 2012-5-31 02:46
本帖最后由 龚正军 于 2012-5-31 02:48 编辑

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

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

但是要在第输入次数过后吧控制台挂起,其实相当简单:你新做一个方法(带break标记),当最后次数到的时候(用if语句判断break到标记位置就行了!!那个方法你可以做成死循环或则无线hold住都可以哦!(但我确实不清楚你这么弄的实际意义在什么地方)
作者: 黄秋    时间: 2012-5-31 02:50
  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 20:51
小手一抖 金币到手
作者: 徐炯    时间: 2012-5-31 22:54
Akm 发表于 2012-5-30 19:20
突然看到这还是 有奖励分的帖子 这楼主太坑人了也  中奖概率才 10% 。。。比中彩票的概率都低。。。。[qq]1 ...

比中彩票的概率都低。。。。
同感!
作者: 吴超    时间: 2012-5-31 22:55
刘蕴学 发表于 2012-5-30 23:15
我的想法是一种休眠主线程,一种用前台线程达到条件死锁,之后用守护线程在规定时间之后唤醒他

还有一种办 ...

试过很多办法,或许这涉及到底层,无法让控制台停止输入,即使sleep,在控制台随便按,虽然在限制时间没效果,但是,过了时间,依旧会出现之前按的
作者: 吴超    时间: 2012-5-31 22:55
龚正军 发表于 2012-5-31 02:46
多数情况都是输入次数到达后,就自动停止登录动作这类要求来得多吧??

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

呵呵   :P
作者: 黄小橙    时间: 2014-10-3 16:47
学习了!
作者: wujiemin    时间: 2014-10-7 22:05
问题是这样的,我希望输入密码错误超过指定次数后,让程序停在那
时间到了,才能输入
作者: 李一白_    时间: 2014-12-19 10:50
来看看,有奖励吗
作者: yuanyuemao88    时间: 2015-8-2 17:59
               
作者: yuanmeng    时间: 2016-4-21 12:58
这段代码我得研究一会儿




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2