Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1050|回复: 0

求助,为什么在运行时数字是无序的 ~ ~ ??急急急

[复制链接]

该用户从未签到

发表于 2011-10-30 08:40:51 | 显示全部楼层 |阅读模式
class AB
{
public static void main(String[] args)  
{
A s=new A();
Thread t1=new Thread(s);
  Thread t2=new Thread(s);
  Thread t3=new Thread(s);
  Thread t4=new Thread(s);
t1.start();
  t2.start();
  t3.start();
  t4.start();
}
}
class A implements Runnable
{
private int tick=100;
public void run()
{
while(true)
{
if(tick>0)
{//try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"......."+tick--);
}
}
}
}
http://www.javaxxz.com
回复

使用道具 举报

该用户从未签到

发表于 2011-10-30 08:40:52 | 显示全部楼层

Re:求助,为什么在运行时数字是无序

我并不是说cpu时间的调度 我所说的是程序打印tick--时 我想结果应该是100 99 98 97 ....顺序递减但实际运行确是无序的比如:100 99 97 96 98 95.......
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-30 08:40:52 | 显示全部楼层

Re:求助,为什么在运行时数字是无序

两个线程a,b
tick假设是90

a中tick--,该打印90,tick变成89,还没有打印90,OK,此时cpu切换线程执行

b开始执行,tick--,该打印89,tick变成88,此时b时间片可能分的多一点又或者b运行的快一点,b线程打印出了89,OK,此时线程再切换

a开始执行,上次a还留了个90没打印,此时打印90


于是就出现了89在前,90在后的现象
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-30 08:40:53 | 显示全部楼层

Re:求助,为什么在运行时数字是无序

楼主,我给你举个例子哈,你在火车站买票,总共有5个窗口,在第一个买地100张票,第99张票就必须让第二个窗口卖么?因为上面的几个线程的优先级都是一样的,所以谁先抢占到cpu谁就先执行输出,他们只要把票卖完就阿了啊!如果你不加上同步代码块在你输出的时候(加上延时就更明显了)就会有负值出现,想必这个你应该明白,如果你加上了同步代码块那么上面的线程就只有第一个是起作用的。下面是代码: Java code
不加同步快:

public class AB {
    public static void main(String[] args) {
        A s = new A();
        Thread t1 = new Thread(s,"售票口->>1");
        Thread t2 = new Thread(s,"售票口->>2");
        Thread t3 = new Thread(s,"售票口->>3");
        Thread t4 = new Thread(s,"售票口->>4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class A implements Runnable {
    private int tick = 10;

    public void run() {
        
            for(int i = 0;i<100;i++){
                if (tick > 0) {
                        try{
                            Thread.sleep(100);
                        }catch(Exception e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "......."
                            + tick--);
                }
            }
        }
}

输出:售票口->>4.......10
售票口->>2.......9
售票口->>1.......8
售票口->>3.......7
售票口->>4.......6
售票口->>1.......5
售票口->>3.......4
售票口->>2.......3
售票口->>4.......2
售票口->>2.......1
售票口->>3.......0
售票口->>1.......-1
售票口->>4.......-2
加上同步代码块: Java code
package study;

public class AB {
    public static void main(String[] args) {
        A s = new A();
        Thread t1 = new Thread(s,"售票口->>1");
        Thread t2 = new Thread(s,"售票口->>2");
        Thread t3 = new Thread(s,"售票口->>3");
        Thread t4 = new Thread(s,"售票口->>4");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
    }
}

class A implements Runnable {
    private int tick = 10;

    public void run() {
        synchronized (this) {
            for(int i = 0;i<100;i++){
                if (tick > 0) {
                        try{
                            Thread.sleep(100);
                        }catch(Exception e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "......."
                            + tick--);
                }
            }
        }
    }
}

输出结果:
售票口->>1.......10
售票口->>1.......9
售票口->>1.......8
售票口->>1.......7
售票口->>1.......6
售票口->>1.......5
售票口->>1.......4
售票口->>1.......3
售票口->>1.......2
售票口->>1.......1
这下楼主应该明白了吧
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-30 08:40:54 | 显示全部楼层

Re:求助,为什么在运行时数字是无序

3楼 谢谢 4楼没有体会我问的问题 不过也谢谢
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-30 08:40:54 | 显示全部楼层

Re:求助,为什么在运行时数字是无序

不过System.out.println(Thread.currentThread().getName() + "......." + tick--);里
不是先打印tick 在执行减减吗,怎么可能出现三楼所说的"tick变成89,还没有打印90"这种情况呢 ??
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-18 19:55 , Processed in 0.372077 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表