当前位置: 代码迷 >> J2SE >> 怎样让changeFlag();调用flag?(多线程参与与不参加的两种情况)
  详细解决方案

怎样让changeFlag();调用flag?(多线程参与与不参加的两种情况)

热度:109   发布时间:2016-04-23 20:05:23.0
怎样让changeFlag();调用flag?(多线程参与与不参与的两种情况)
      以下代码中,疑问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接口没有任何关系
  相关解决方案