黑马程序员技术交流社区
标题:
多线程问题
[打印本页]
作者:
Friendy89
时间:
2013-4-6 12:08
标题:
多线程问题
本帖最后由 Friendy89 于 2013-4-7 00:03 编辑
class Ticket implements Runnable
{
private int tick=100;
public void run()
{
//for (tick=100;tick>0 ;tick-- )
while(true)
{
if (tick>0)
{
System.out.println(Thread.currentThread().getName()+"...sale..."+tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t); //创建一个线程。
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
程序中while循环为什么不能用for循环代替,我试了一下,运行结果会出现多个Thread-编号....sale.....100
作者:
张洪慊
时间:
2013-4-6 12:34
本帖最后由 张洪慊 于 2013-4-6 12:35 编辑
for (tick=100;tick>0 ;tick-- )//tick再次赋值为100
for( ; tick>0;tick--)//改正 我没测试 可能有别的错误
可能出现一种情况:
class Ticket implements Runnable
{
private int tick=100;
public void run()
{ //2.cpu切换到1线程,但是此时tick再次被赋值为100 下面会输出100
//for (tick=100;tick>0 ;tick-- )
while(true)
{
if (tick>0)
{ //1.cpu切换到0线程执行到这 此时tick=100,输出100,此时tick=99
System.out.println(Thread.currentThread().getName()+"...sale..."+tick--);
}
}
}
}
复制代码
作者:
田光峰
时间:
2013-4-6 12:41
class Ticket implements Runnable
{
private int tick=100;
public void run()
{
//for (tick=100;tick>0 ;tick-- )
while(true)
{
if (tick>0)
{
System.out.println(Thread.currentThread().getName()+"...sale..."+tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t); //创建一个线程。
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
---------------------------------------------------------------------------------------------------------
原因是这样的:
class Ticket 实现Runnable接口 则创建的线程使用的是同一个资源----类中的成员
当使用
while(true)
时
System.out.println(Thread.currentThread().getName()+"...sale..."+
tick--
);
tick
是共同资源
而当使用
for (tick=100;tick>0 ;tick-- )
时
tick
是局部的,是不共用,每个线程都可有一个,在执行时就会出现相同的结果。
作者:
刘吉庆
时间:
2013-4-6 12:45
本帖最后由 刘吉庆 于 2013-4-6 12:48 编辑
当然可以替代,只是用的场景不同罢了,while用于不知道具体循环次数,而for多用于确定具体次数的循环。
代码我改为如下:
package cn.bbs;
class Ticket implements Runnable {
private int tick = 100;
public void run() {
// while (true) {
// if (tick > 0) {
// System.out.println(Thread.currentThread().getName()
// + "...sale..." + tick--);
// } else {
// break;//停止
// }
// }
for (; tick > 0;) {//第条新建线程start就会执行run()方法,因如你所写for (tick=100;tick>0 ;tick--),每次都会给重新赋值,tick--在输出语句已经减过,因此不必再减
System.out.println(Thread.currentThread().getName() + "...sale..."
+ tick--);
}
}
}
public class TicketDemo {
public static void main(String[] args) {
Ticket t = new Ticket();
Thread t1 = new Thread(t); // 创建一个线程。
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
作者:
飞天小猪猪
时间:
2013-4-6 12:46
因为在for循环中 ticket是局部变量 4个进程分别进来调用run方法时,找的ticket都是for循环中的,这时的ticket就不是共享资源。只要让ticket变成共享数据,就不会有多个sale...100了
将for(;tick>0;tick--)就可以了,因为已经定义了全局变量ticket=100了,所以不要在for条件中给ticket=100
作者:
_王涛
时间:
2013-4-6 13:15
我对你的代码进行了修改和解释如下:
class Ticket2 implements Runnable
{
Object obj=new Object();
private int tick=100;
public void run()
{
for (tick=100;tick>0 ; tick--)//控制票数的只有tick--
// while(true)
{ synchronized(this){//考虑到线程安全问题,此处必须加同步代码块
if (tick>0)
{
System.out.println(Thread.currentThread().getName()+"...sale..."+tick);//此处不必每次再减1
}
}
}
}
}
public class TestRunable
{
public static void main(String[] args)
{
Ticket2 t=new Ticket2();
Thread t1=new Thread(t); //创建一个线程。
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
作者:
陈丽莉
时间:
2013-4-6 18:25
请及时处理帖子,追问或改成【已解决】~ 至少让大家知道楼主在哦~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2