当我想使用多线程充当键盘侦听器时,我遇到了问题。
所以我写了这些代码。
private static boolean out=false;
public static void main(String[] args)
{
new Thread(new Runnable() {
@Override
public void run() {
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
try{
reader.readLine();
reader.close();
}catch (Exception e){e.printStackTrace();}
out=true;
System.out.println(" have received the keyboard");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true)
if(out)
break;
System.out.println(" exit the loop");
}
}).start();
}但是,当我在控制台中输入某些内容时,第二个线程似乎无法运行。
如果我的代码或表达式不清楚或错误,请告诉我。
谢谢你!
发布于 2018-04-12 12:56:04
第二个线程在执行程序时已经在运行,但是由于您没有为变量out分配一个新值,所以if-clause将始终无限地计算到false,因此不会中断。
您可以通过将true分配给out并使其为volatile来修复这个问题,以便使用最新更新的值。试着做这样的事情:
private static volatile boolean out = false;
public static void main( String[] args )
{
new Thread( new Runnable()
{
@Override
public void run()
{
BufferedReader reader = new BufferedReader( new InputStreamReader( System.in ) );
try
{
reader.readLine();
// will only be executed after input since BufferedReader.readLine() is blocking.
out = true;
reader.close();
}
catch ( Exception e )
{
e.printStackTrace();
}
System.out.println( " have received the keyboard" );
}
} ).start();
new Thread( new Runnable()
{
@Override
public void run()
{
// added to show that the 2nd thread started.
System.out.println( "Thread 2 started running...." );
while ( true )
if ( out )
break;
System.out.println( " exit the loop" );
}
} ).start();
}https://stackoverflow.com/questions/49796980
复制相似问题