文档章节

多线程——线程睡眠sleep()在Synchronous中和外面的区别(JAVA)

白天__黑夜
 白天__黑夜
发布于 2017/05/21 15:13
字数 628
阅读 8
收藏 0

    lz有一次为了实现一个功能时做了一个测试,这个测试的大概内容是这样的:

    有100个数据,每个线程读取睡眠一秒,如果是一个线程读取的话,需要100秒才能读完,那么开启四个线程的话只用25秒就可以读完。

     从理论上来说,这是一个很简单的测试,不管你是用同步关键字做或者锁都可以,所以lz采用了同步关键字进行测试。

    public class test{

    static ArrayList<String> arr = new ArrayList<String>();
    public static void main(String[] args){
        
        System.out.println("begin:"+(System.currentTimeMillis()/1000));
      
        for(int i=0;i<100;i++){ 
            final String log = ""+(i+1);
            {
                arr.add(log);
            }
        }
       
        Runnable r = new Runnable() {
            int b = 16;
            @Override
            public void run() {
                while(true){

                    //方法外
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }    
                    synchronized (test4.class) {
                        if(b>0){
                            //方法内
                            System.out.println(Thread.currentThread().getName()+" : "+b--);
                        }
                        System.out.println(Thread.currentThread().getName()+":"+b++);*/
                    }
                }
            }
        };
        for (int i = 0; i < 4; i++) {
                new Thread(r).start();
            }
        }
    
   
    public static void parseLog(String log){
        System.out.println(Thread.currentThread().getName()+" : "+log+":"+(System.currentTimeMillis()/1000));
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }        
    }
}

如上面的代码:

    Thread.sleep(1000);如果在方法内部的话那么程序最终执行还是需要100秒,即使开了四个线程也没有作用。

    Thread.sleep(1000);如果在方法外的话,那么就可以实现25秒执行完。

    lz最开始的时候就时因为写错了格式,将方法写入到同步里面了,当时仔细检查了所有的逻辑也没发现,直到最终突然看到sleep方法位置貌似不对,然后重新调试了下发现问题解决。

     lz分析了一下两种的问题根节所在:

     1.在方法内部的话,因为有同步,所以只能有一个线程进行访问,启动了四个线程,相当于除了线程本身的睡眠一面(parseLog方法中睡眠),每一次线程的同步都会再次睡眠,那么形象的说就是当同步完成释放锁时,四个线程进行切换,但是每一个进入同步后都会睡眠一秒,所以总体时间不变。

    2.在方法外部的话,与1不同的便是,四个线程之间的切换不耗费时间,只是每一个线程在执行run方法是睡眠一秒,所以这样的话,便实现了四个线程访问所需25秒的情况。

      每一次的博客即是分享也是对自己的一个总结,未来还很长,大家一起努力吧!

© 著作权归作者所有

共有 人打赏支持
白天__黑夜
粉丝 0
博文 2
码字总数 1314
作品 0
商洛
从Java到JVM到OS线程睡眠

前言 Java 中有时需要将线程进入睡眠状态,这时一般我们就会通过使线程进入睡眠状态,接下去就看看执行该语句在 JVM 中做了什么。 简单例子 以下是一个简单的例子,使主线程睡眠5秒钟。 JVM ...

超人汪小建
08/20
0
0
【转】15个顶级Java多线程面试题及回答

Java 线程面试问题   在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务...

一只死笨死笨的猪
2014/09/30
0
0
15个顶级Java多线程面试题及回答

Java 线程面试问题 在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。如果你想获得任何股票投资银行的前台资讯职位,那么你应该准备很多关于多线程的问题。在投资银行业务中多...

LCZ777
2014/05/27
0
0
JAVA多线程,面试者的最爱!

多线程 线程:是指进程中的一个执行流程。 线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内...

晨曦之光
2012/03/13
0
0
多线程Multi-Threading

0、Java中多线程同步是什么? 在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序...

tinder_boy
08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
43分钟前
1
0
vm GC 日志 配置及查看

-XX:+PrintGCDetails 打印 gc 日志 -XX:+PrintTenuringDistribution 监控晋升分布 -XX:+PrintGCTimeStamps 包含时间戳 -XX:+printGCDateStamps 包含时间 -Xloggc:<filename> 可以将数据保存为......

Canaan_
昨天
0
0
学习设计模式——生成器模式

1. 认识生成器模式 1. 定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 2. 组成: Builder:生成器接口,定义创建一个Product对象所需要的各个组件的操作,...

江左煤郎
昨天
0
0
C语言精要(第二章:基本数据类型)

2.1 C语言基本数据类型 在计算机术语中,把⼆进制数中的某⼀位数又称为⼀个⽐特(bit)。⽐特这个单位对于计算机⽽⾔,在度量上是最⼩的单位。除了⽐特之外,还有字节(byte)这个术语。⼀个...

ryanliue
昨天
0
0
实现下拉菜单多选框效果

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><li>工作意愿地:<%-- <c:forEach items="${list}" var="list"><input type="checkbox" value="${list......

lanjian28
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部