以下代码中,疑问1://System.out.print(x+"\t");这一句没有,就执行一次run();,如同结果01.
疑问2:加上//System.out.print(x+"\t");这一句,运行结果不确定。
有时候run();多执行了几次,有时候少执行了几次。为何?
疑问3:很明显,在Matter继承了Runnable接口之后,changeFlag()可以控制flag了。
为何没有继承Runnable,就无法让changeFlag();控制flag?
class Matter implements Runnable
{
private boolean flag = true;
public void run()
{
while(flag)
{
System.out.println(Thread.currentThread().getName()+"..|- run ");
}
}
public void changeFlag()
{
flag = false;
}
}
class ThreadMatter
{
public static void main(String[] args)
{
Matter op = new Matter();
new Thread(op).start();//--线程1
//new Thread(op).start();//--线程2
for(int x=0;x<15;x++)
{
if (x>6)
{
op.changeFlag();
break;
}
System.out.println(x+" main\t");
}
System.out.println(" over ");
}
}
/* --结果--01
E:\java0217\day12>java ThreadMatter
over
Thread-0..|- run //--只打印了一次
E:\java0217\day12>
*/
/*疑问1://System.out.print(x+"\t");这一句没有,就执行一次run();,如同结果01.
疑问2:加上//System.out.print(x+"\t");这一句,运行结果不确定。
有时候run();多执行了几次,有时候少执行了几次。为何?
疑问3:很明显,在Matter继承了Runnable接口之后,changeFlag()可以控制flag了。
为何没有继承Runnable,就无法让changeFlag();控制flag?
*/
------解决思路----------------------
1、当主线程中调用changeFlag将子线程中的flag变量设置为false后,如果这时你的子线程还没执行到while(flag)语句,那么当子线程执行到while(flag)时,就不会进行while循环,run()方法执行完,子线程也就退出了!简单说,主线中可能已经将flag置为false,而你的子线程还没来的及执行while就退出了
2、能不能调用changeFlag改变flag的置跟Matter类是否是实现Runnable接口没有任何关系