首页 新闻 会员 周边

一个Java线程例子的疑惑

0
悬赏园豆:10 [待解决问题]

刚开始学Java, 书上有一个例子:当用户输入密码的时候启动一个线程,用户输入一个明文密码字符这个子线程就用一个星号给屏蔽掉,例子程序虽然没有明显做同步处理,但主线程接收一个字符,子线程屏蔽一个字符这样的过程是却符合生产消费模型的,令人生疑,是子线程和Scanner之间私下有什么勾当吗?Java中子线程是如何感受到键盘输入的呢?请各位帮我这个菜鸟解答下,谢谢了

 

输出如下:

input your name:vince

password******

Welcom vince

 

子线程代码:EraserThread.java

View Code
//Eraser Thread
public class EraserThread extends Thread
{
private boolean active;

private String mask;

public EraserThread()
{
this('*');
}

public EraserThread(char maskChar)
{
active = true;
mask = "\010" + maskChar;
}

public void setActive(boolean active)
{

this.active = active;
}

public boolean isActive()
{
return active;
}

public void run()
{
while(isActive())
{
System.out.print(mask);

try{
Thread.currentThread().sleep(50);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}


主程序代码:EraserThreadDemo.java

View Code
//Eraser Thread Demo
import java.util.Scanner;

public class EraserThreadDemo
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
String name;
String psd;


while(true)
{
System.out.print("input your name:");

name = scanner.next();

System.out.print("password:");

EraserThread th = new EraserThread();
th.start();

psd = scanner.next();

th.setActive(false);

if ("vince".equals(name) &&
"12345".equals(psd))
{
System.out.println("Welcom "+name);
break;
}
else
{
System.out.println("name or password error!");
}

}
}
}
xu.tony的主页 xu.tony | 初学一级 | 园豆:190
提问于:2012-03-03 16:30
< >
分享
所有回答(2)
0

我想问一下,你这个能运行吗?

英雄小强 | 园豆:292 (菜鸟二级) | 2012-03-05 16:47

测试过,可运行。运行环境是:Ubuntu 11.10 + OpenJDK 6

支持(0) 反对(0) xu.tony | 园豆:190 (初学一级) | 2012-03-05 17:49

@vincexu: 哥  我错了  没那环境...  WIN7+JDK6

支持(0) 反对(0) 英雄小强 | 园豆:292 (菜鸟二级) | 2012-03-05 17:50
0
这个和线程通信没有关系。
EraserThread线程启动后一直在运行,每50ms做一次动作:退一格,然后输出字符*号。
第一次执行,删除了password后面的冒号,然后输出*号。你还没有输入密码时,控制台应该已经有一个*号了。
如果还没输入,就删除*号,再输出*号。输入字符后,每次删除你输入的字符,然后输出*号。
看上去是针对你的输入做了动作,其实一直在做固定的动作。
yajiao | 园豆:218 (菜鸟二级) | 2013-01-22 22:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册