A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*编写10个线程, 第一个线程从1加到10, 第二个线程从11加到20, ...,
第十个线程从91加到100, 最后再把10个线程的结果相加输出到控制台上
纪念基础班,纪念1ms的精髓.
*/
package Test;
public class Test04 {
        public static void main(String[] args) throws Exception {
                for(int i=0;i<10;i++){
                        SumThread s1=new SumThread();
                        //setName()方法继承自Thread类
                        s1.setName("第"+(i+1)+"条线程");
                        //setNum()方法在类里已经定义,传入的int参数依次是run()方法里面for循环的初始值:1,11,21,31...91
                        s1.setNum(i*10+1);
                        s1.start();
                        /*精髓所在,这个for循环是主线程,主线程睡1ms,足够让本次开启的线程执行完毕,
                         * 避免多个线程抢占CPU的执行权,而出现图二的运行结果.*/
                        Thread.sleep(1);
                }
        }
}
class SumThread extends Thread{
        //定义为静态,被每条线程所共享,统计10条线程求和结果的总和
        private static int total;
        private int num;
        public void setNum(int num){
                this.num=num;
        }
        public int getNum(){
                return num;
        }
        //复写run()方法
        public void run(){
                synchronized (SumThread.class) {
                        int sum=0;
                        for(int i=num;i<num+10;i++){
                                sum+=i;
                        }
                        total+=sum;
                        System.out.println(getName()+"的和为:"+sum);
                        //num==91表示此次开启的是第10条线程,其值为10条线程执行结果的总和
                        if(num==91){
                                System.out.println("总和为:"+total);
                        }
                }
        }
}

图1.png (11.34 KB, 下载次数: 25)

图1.png

图2.png (11.43 KB, 下载次数: 20)

图2.png

评分

参与人数 2黑马币 +7 收起 理由
wyh2016 + 5 很给力!
guojiayuan + 2

查看全部评分

14 个回复

倒序浏览
wujianming 来自手机 注册黑马 2016-12-16 22:39:25
沙发
现在在玩呢。。。。快结束了。。
回复 使用道具 举报
wujianming 发表于 2016-12-16 22:39
现在在玩呢。。。。快结束了。。

听过一句话,任何时候开始学习都不晚,只要肯坚持,最差的结局是:大器晚成。
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
时间花在哪里,你的成就就在那里!____明哥数学老师语录
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
guojiayuan 发表于 2016-12-17 00:23
时间花在哪里,你的成就就在那里!____明哥数学老师语录

铜钱孔滴油而不沾,手熟尔固然不错,工艺工装防呆更佳。
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
在你这个年纪写出这么高深的代码,在下只能说两个字,不得不服,加油!
回复 使用道具 举报
哎哟,不错嘛,同步代码块可以缩小,这样效率更高,因为这里的临界资源就是total,所以,synchronized只需要同步对total的操作。若想对线程的执行顺序把控,可以通过wait和notify来实现
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
哎哟,不错额 发表于 2016-12-17 08:45
哎哟,不错嘛,同步代码块可以缩小,这样效率更高,因为这里的临界资源就是total,所以,synchronized只需 ...

缩小同步代码块我很赞同。这里模拟的每条线程只执行一次,执行顺序的切换用wait、notifyAll再加10个flag标志,我觉得代码会不会太臃肿?当然也可以用互斥锁对象创建condition监视器,再利用监视器的await、signal来做。但是,做法会不会没有新意?这里的小睡1ms才是精髓啊宝宝
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
wyh2016 发表于 2016-12-17 00:35
在你这个年纪写出这么高深的代码,在下只能说两个字,不得不服,加油!

灌水打湿你好…不生产水,都是大自然的搬运工
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
Albertups 发表于 2016-12-17 10:59
缩小同步代码块我很赞同。这里模拟的每条线程只执行一次,执行顺序的切换用wait、notifyAll再加10个flag ...

小睡一秒,再某些极端环境下,次序性会被打乱,这里synchronized取得是类为全局monitor,是否可以,定义一个全局对象,然后,在这个对象中,进行线程次序的控制,这样代码就优雅了一些
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
哎哟,不错额 发表于 2016-12-17 08:45
哎哟,不错嘛,同步代码块可以缩小,这样效率更高,因为这里的临界资源就是total,所以,synchronized只需 ...

你就是传说中那个周杰伦么
回复 使用道具 举报
wyh2016 发表于 2016-12-17 13:29
你就是传说中那个周杰伦么

头像却现实的是帅气的思聪
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
哎哟,不错额 发表于 2016-12-17 11:31
小睡一秒,再某些极端环境下,次序性会被打乱,这里synchronized取得是类为全局monitor,是否可以,定义 ...

可以的,比如定义一个Object类的对象:static Object obj=new Object();锁的时候就锁这个对象:synchronized(obj){}
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端
回复 使用道具 举报
回复 使用道具 举报
写得好漂亮,很不错很不错,要学习一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马