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, 下载次数: 171)

QQ截图20120527214809.jpg

评分

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

查看全部评分

29 个回复

倒序浏览
问题是这样的,我希望输入密码错误超过指定次数后,让程序停在那
时间到了,才能输入
回复 使用道具 举报
{:soso_e130:}自己先顶起~~~~~~~~~~~
回复 使用道具 举报
sleep一下 呵呵
回复 使用道具 举报
张晨 发表于 2012-5-30 10:33
sleep一下 呵呵

呵呵,你可把代码复制尝试下,我下面有timer和线程sleep方法
回复 使用道具 举报
你sleep只有有什么问题吗?
回复 使用道具 举报
你是想控制台不能打字还是说程序挂起不进行验证?
回复 使用道具 举报
吴超 金牌黑马 2012-5-30 18:13:48
8#
刘蕴学 发表于 2012-5-30 11:47
你是想控制台不能打字还是说程序挂起不进行验证?

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

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

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

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

那不好意思了,我用的是Random类的方法
回复 使用道具 举报
吴超 发表于 2012-5-30 22:06
呵呵,我的需求是这样,不过,需求是在我输入帐号错误超过次数的情况下 ...

那用户名输入错误超过3次了,系统挂5秒,然后又可以继续输入,那输入的次数要清0吗?
回复 使用道具 举报

  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:17 编辑

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

还有一种办法就是装饰模式,重新弄一个新的包装流,然后sleep他
回复 使用道具 举报
本帖最后由 龚正军 于 2012-5-31 02:48 编辑

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

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

但是要在第输入次数过后吧控制台挂起,其实相当简单:你新做一个方法(带break标记),当最后次数到的时候(用if语句判断break到标记位置就行了!!那个方法你可以做成死循环或则无线hold住都可以哦!(但我确实不清楚你这么弄的实际意义在什么地方)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马