黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
罗磊
时间:
2012-8-20 15:11
标题:
多线程问题
本帖最后由 罗磊 于 2012-8-20 15:14 编辑
class Tisk2 implements Runnable{
int tisk = 10000;
public synchronized void run(){//为了简化代码 我把判断条件提到 while里 于是
while(tisk>0){//这里出现了安全隐患 所以我想加锁 可是加那呢?
//如果加在函数上 就是只有一个线程运行啦 !而且运行结果是下面的结果是从5794开始!
//而加代码块!虽然可以多线程,但也有安全隐患!而且是从5790开始!且有负票!
//我想这也就是毕老师说的为什么这里条件要用true的原因吧 !
//但我想如果我非要这么做 然后出现这种结果怎么处理呢?
System.out.println(Thread.currentThread().getName()+"....."+tisk--);
}
}
public static void main(String[] args) {
Tisk2 t= new Tisk2();
Thread th1 = new Thread(t,"th1");
Thread th2 = new Thread(t,"th2");
Thread th3= new Thread(t,"th3");
Thread th4 = new Thread(t,"th4");
Thread th5 = new Thread(t,"th5");
Thread th6 = new Thread(t,"th6");
th1.start();
th2.start();
th3.start();
th4.start();
th5.start();
th6.start();
}
}
加在函数上的运行结果:
th2.....5794
th2.....5793
th2.....5792
th2.....5791
th2.....5790
th2.....5789
th2.....5788
th2.....5787...我就不多截图了 ,反正是从5794开始(为什么是这样?) 而且一直是2线程 然而 我把int改为1000时又能从1000开始运行 但也是2线程在走 这里我就不解了!请帮忙解释下
作者:
刘芮铭
时间:
2012-8-20 16:16
class Tisk2 implements Runnable
{
int tisk = 10000;
public void run()
//最开始的代码,你将synchronized加到run()方法上,由于里面有个判断while(Tisk>0),所以一直执行的是同一个线程,while不判断完不罢休,呵呵
{
while (true)
{
synchronized(Tisk2.class)
//出现负数的情况是由于线程与线程之间的执行次序,有些线程还没执行完,其实其他线程已经执行了一部分,
//所以需要加上synchronized代码块!并才用双重判断,类似与单例设计模式一样!
{
if (tisk>0)
{
System.out.println(Thread.currentThread().getName()+"....."+tisk--);
}
else
break;
}
}
}
public static void main(String[] args)
{
Tisk2 t= new Tisk2();
Thread th1 = new Thread(t,"th1");
Thread th2 = new Thread(t,"th2");
Thread th3= new Thread(t,"th3");
Thread th4 = new Thread(t,"th4");
Thread th5 = new Thread(t,"th5");
Thread th6 = new Thread(t,"th6");
th1.start();
th2.start();
th3.start();
th4.start();
th5.start();
th6.start();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2