刚开始学Java, 书上有一个例子:当用户输入密码的时候启动一个线程,用户输入一个明文密码字符这个子线程就用一个星号给屏蔽掉,例子程序虽然没有明显做同步处理,但主线程接收一个字符,子线程屏蔽一个字符这样的过程是却符合生产消费模型的,令人生疑,是子线程和Scanner之间私下有什么勾当吗?Java中子线程是如何感受到键盘输入的呢?请各位帮我这个菜鸟解答下,谢谢了
输出如下:
input your name:vince
password******
Welcom vince
子线程代码:EraserThread.java
//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
//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!");
}
}
}
}
我想问一下,你这个能运行吗?
测试过,可运行。运行环境是:Ubuntu 11.10 + OpenJDK 6
@vincexu: 哥 我错了 没那环境... WIN7+JDK6
这个和线程通信没有关系。
EraserThread线程启动后一直在运行,每50ms做一次动作:退一格,然后输出字符*号。
第一次执行,删除了password后面的冒号,然后输出*号。你还没有输入密码时,控制台应该已经有一个*号了。
如果还没输入,就删除*号,再输出*号。输入字符后,每次删除你输入的字符,然后输出*号。
看上去是针对你的输入做了动作,其实一直在做固定的动作。