精华内容
下载资源
问答
  • JAVA面试题(9)

    千次阅读 2019-10-13 23:21:57
    1.已知表达式 int m [ ] = {9,1,2,3,4,5,6}; 下面哪个表达式的值与数组下标量总数相等?( ) A .m.length() B.m.length ...2.下面能让线程停止执行的有(多选)( ) A. sleep(); B. stop(); C...

    1.已知表达式 int m [ ] = {9,1,2,3,4,5,6};

    下面哪个表达式的值与数组下标量总数相等?( )
    A .m.length()
    B.m.length
    C.m.length()+1
    D.m.length+1

    答案:B
    解析:数组下标是从零开始的,但是数据下标的总量和数据长度相同。

    2.下面能让线程停止执行的有(多选)( )

    A. sleep();
    B. stop();
    C. notify();
    D. synchronized();
    E. yield();
    F. wait();
    G. notifyAll(); 答案:ABDEF
    解析:sleep:导致此线程暂停执行指定时间 stop:
    这个方法将终止所有未结束的方法,包括run方法。 notify();唤醒线程 synchronized():对象锁
    yield:当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,这就是yield。
    wait:当前正在被服务的线程需要睡一会,醒来后继续被服务 notifyAll();唤醒所有线程

    3.下列说法正确的有()

    A. 在类方法中可用this来调用本类的类方法
    B. 在类方法中调用本类的类方法时可直接调用
    C. 在类方法中只能调用本类中的类方法
    D.在类方法中绝对不能调用实例方法
    答案:B
    解析: A.在类方法中不能使用this关键字 C.在类方法中可以调用其它类中的类方法
    D.在类方法中可以通过实例化对象调用实例方法

    4.关于Java语言,下列描述正确的是(多选)

    A. switch 不能够作用在String类型上
    B. List, Set, Map都继承自Collection接口
    C.Java语言支持goto语句
    D. GC是垃圾收集器,程序员不用担心内存管理
    答案:AD
    解析: B.Map没有继承Collection接口 C.java不支持goto语句

    5.Which two demonstrate a ?has a” relationship(Choose two)?()

    A. public interface Person { } public class Employee extends Person{ }
    B. public interface Shape { } public interface Rectandle extends Shape{ }
    C. public interface Colorable { } public class Shape implementsColorable { }
    D. public class Species{ } public class Animal{private
    Species species;} E. interface Component{ } class Container implements
    Component{ private Component[] children; }
    答案:D
    解析: “hasa”是关联关系,关联分双向关联和单向关联,双向关联是A,B类分别持有对方的引用(有是对方的属性). 单向关联是一方持另一方的引用.

    6.Given the folowing classes which of the following will compile without error?()

    interface IFace{}
    class CFace implements IFace{}
    class Base{}
    public class ObRef extends Base{
    public static void main(String argv[]){
    ObRef ob = new ObRef();
    Base b = new Base();
    Object o1 = new Object();
    IFace o2 = new CFace();
    }
    }
    

    A. o1=o2;
    B. b=ob;
    C. ob=b;
    D. o1=b;
    答案:B 解析:
    b和ob对应的类之间没有任何关系,要想b=ob成立要么是父子关系,要么是接口实现类的关系

    7.问:简单说说 Array 和 ArrayList 的区别?

    答:这题相当小儿科,Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型;Array 的大小是固定的,ArrayList 的大小是动态变化的;ArrayList 提供了更多的方法和特性,譬如addAll()、removeAll()、iterator() 等。

    8.问:为什么 HashMap 中 String、Integer 这样的包装类适合作为 key 键,即为什么使用它们可以减少哈希碰撞?

    答:因为 String、Integer 等包装类是 final 类型的,具有不可变性,而且已经重写了 equals() 和hashCode() 方法。不可变性保证了计算 hashCode()后键值的唯一性和缓存特性,不会出现放入和获取时哈希码不同的情况且读取哈希值的高效性,此外官方实现的 equals() 和hashCode() 都是严格遵守相关规范的,不会出现错误。

    如果觉得我写的还行,请关注我的公众号,每天定时推送干货.
    在这里插入图片描述

    展开全文
  • 被阻塞的时间加上函数执行的100毫秒,现在整体时间已经超过100毫秒,所以我刚才点击这个按纽,你会发现时候卡,时候不卡,不卡的时候是因为我点击这个按纽的时候,恰巧没有...
  • 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface什么区别? ...
  • 我们先进行一个简单纯SIP信令(不带语音连接建立)UACSIP终端程序开发试验(即一个只能作为主叫不作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面说明,...
  • 如何使用CyclicBarrier?

    2020-08-13 23:02:48
    CyclicBarrier 是一种线程协作方法,它可以一个线程执行到某个点停止,并等待其它线程到达这个点集结完毕再继续运行。 从名字翻译可以看出 CyclicBarrier是「篱栅」,你可以想象在某个赛道上比赛,每场比赛...

    CyclicBarrier 是一种线程协作的方法,它可以让一个线程执行到某个点停止,并等待其它线程到达这个点集结完毕再继续运行。

    从名字的翻译可以看出 CyclicBarrier是「篱栅」,你可以想象在某个赛道上有比赛,每场比赛需要5匹马到达篱栅才能开始,如下
    在这里插入图片描述
    从这图可以看出,有5匹马要进行比赛,但由于马5没有到达赛场,而导致比赛不能开始,下面是代码演示

    public class CyclicBarrierDemo {
    
        static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
    
        public static void main(String[] args) {
    
            ExecutorService threadPool = Executors.newFixedThreadPool(5);
    
            for (int i = 0; i < 4; ++i) {
                threadPool.submit(new Task());
            }
            threadPool.shutdown();
    
        }
    
        static class Task implements Runnable {
    
            @Override
            public void run() {
    
                System.out.println(Thread.currentThread().getName()
                        + "已就位,等待其它马进场");
                try {
                    cyclicBarrier.await(); //await()方法,等待设置的参数的个数的线程集结完毕
                    System.out.println(Thread.currentThread().getName()
                            + "开始赛跑");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    在这里插入图片描述
    从打印的结果来看,程序一直在运行,但没有结束。因为我们在上面创建 CyclicBarrier 对象的时候,传入的参数是5,也就是意味着,需要5个线程执行到调用到 await()方法的地方5次,也就是我们上面说的,需要5匹马同时到场,我们才能继续执行后面的代码,但由于我们只提交了4个任务,也就是到达了4匹马,而没有再多创建一个线程,所以这4个线程就在调用 await()方法的地方继续等待,也就是等待最后1匹马到场就可以继续执行。

    当5匹马到达篱栅
    在这里插入图片描述
    所有到场的马开始奔跑
    在这里插入图片描述
    代码如下

    public class CyclicBarrierDemo {
    
        static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
    
        public static void main(String[] args) {
    
            ExecutorService threadPool = Executors.newFixedThreadPool(5);
    
            for (int i = 0; i < 5; ++i) {
                threadPool.submit(new Task());
            }
            threadPool.shutdown();
    
        }
    
        static class Task implements Runnable {
    
            @Override
            public void run() {
    
                System.out.println(Thread.currentThread().getName()
                        + "已就位,等待其它马进场");
                try {
                    cyclicBarrier.await(); //await()方法,等待设置的参数的个数的线程集结完毕
                    System.out.println(Thread.currentThread().getName()
                            + "开始赛跑");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    修改的代码

    for (int i = 0; i < 4; ++i)for (int i = 0; i < 5; ++i)
    

    我们只是多创建提交了一个任务,也就是让第5匹马到达篱栅前, 就达到了比赛开始的条件,也就开始赛跑。

    初始化在哪?创建 CyclicBarrier(int parties)的时候,传入的parties参数就是了。后面我们每次调用 await()方法,parties 的个数就减1,直到为0,篱栅就放开,让所有等待执行的任务继续执行。

    构造器方法

    CyclicBarrier(int parties)
    CyclicBarrier(int parties, Runnable barrierAction)
    

    一个参数的构造器,传入的参数,是在某些位置,需要调用 await()的次数
    两个参数的构造器,我这个没用过,等以后有用过来补坑 @TODO

    等待方法

    int await()
    int await(long timeout, TimeUnit unit)
    

    没有带参数的,每次调用,count减1(count初始化的个数是parties的个数),直到count为0,任务就继续向下执行

    带参数的 await(long timeout, TimeUnit unit),第一个参数是设置超时时间的多少,第二个参数设置的是超时时间的单位,当调用 await()的任务在等待其它任务调用 await(),促使count为0后,继续执行后面内容,但由于没有等到最后一个任务调用就超时了,这时候程序会抛出 BrokenBarrierException,并停止运行

    在这里插入图片描述
    修改代码的地方

    cyclicBarrier.await() → cyclicBarrier.await(5, TimeUnit.SECONDS);
    //多捕获了一个异常
    catch (TimeoutException e) {e.printStackTrace();}
    

    为什么是抛出 BrokenBarrierException呢?我很疑惑,我还调整了顺序,让捕获TimeoutException在代码放在前面,但还是抛出 BrokenBarrierException,很不解。这里留个坑,等以后想通了来补@TODO

    查看篱栅撤掉前,需要调用 await()的次数

    getParties()
    

    查看在篱栅处等待的任务的个数

    getNumberWaiting()
    

    将篱栅重置为初始的状态

    cyclicBarrier.reset();
    

    注:同样是上面的例子,我修改了添加了一部分代码
    在这里插入图片描述
    在这里,我没有调用重置,但是可以继续执行下去,也就是说,当篱栅用过一次后,如果我们不调用 reset(),那么它会默认重置?

    我看了源码之后才发现,是的,当最后一次调用了 await()方法后,进入 dowait()方法中里面的某些代码,如下一小段代码的截图

                int index = --count; //最后一次调用await()后,--count就为0了,此时的index也是0
                if (index == 0) {  
                    boolean ranAction = false;
                    try {
                        final Runnable command = barrierCommand;
                        if (command != null) //因为我们用两个参数的构造器,所以这个 command为null,忽略这行代码
                            command.run();
                        ranAction = true;
                        nextGeneration(); //这一行是关键
                        return 0;
                    } finally {
                        if (!ranAction)
                            breakBarrier();
                    }
                }
    

    下面是 nextGeneration() 的源码

     private void nextGeneration() {
            // signal completion of last generation
            trip.signalAll();
            // set up next generation
            count = parties; //它重置了count的数量,也就是说,又可以重新使用 await()方法了
            generation = new Generation();
        }
    

    至于 reset()方法中的源码

     public void reset() {
            final ReentrantLock lock = this.lock;
            lock.lock();
            try {
                breakBarrier();   // break the current generation
                nextGeneration(); // start a new generation
            } finally {
                lock.unlock();
            }
        }
    

    从上面的 nextGeneration()方法可以看出,reset()方法是重置了count,使得可以重新使用 await()方法

    注:又发现了个问题,就是在多线程的情况下,你调用了 reset()方法的时候,其它线程同时也在调用 await()方法,那么这时候可能抛出BrokenBarrierException异常

    public class CyclicBarrierDemo {
    
        static CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
    
        public static void main(String[] args) throws InterruptedException {
    
            ExecutorService threadPool = Executors.newFixedThreadPool(10);
    
            for (int i = 0; i < 20; ++i) {
                threadPool.submit(new Task());
            }
    
    
    
            threadPool.shutdown();
    
        }
    
        static class Task implements Runnable {
    
            @Override
            public void run() {
    
    
                System.out.println(Thread.currentThread().getName()
                        + "已就位,等待其它马进场");
                try {
                    cyclicBarrier.await(); 
                    System.out.println(Thread.currentThread().getName()
                            + "开始赛跑");
                    cyclicBarrier.reset();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    一部分运行结果的截图
    在这里插入图片描述
    给大家看张图就知道了

    在这里插入图片描述
    如图所示,在多线程情况下,你一个线程执行 reset()方法进入后,再进入 breakBarrier()方法中,当你把 generation.broken 赋值为 true,然后切换到其它线程,其它线程刚好调用了 await() 方法进入到 dowait()方法中,刚好判断了 generation.broken,因为前面的线程修改了它,所以 generation.broken 为trun,最后抛出了 BrokenBarrierException


    欢迎大家关注下个人的「公众号」:独醉贪欢

    展开全文
  • run()方法可以产生必须退出标志来停止一个线程。 40.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 答:接口可以继承接口。抽象类可以实现(implements)接口...
  • 有些软件在安装后,并没有提供卸载程序,即使在控制面板中将其删除,仍然会残余的线程文件向外发送信息,用户通常只能采用手工办法去删除,这样操作起来不但麻烦,而且还容易误删系统文件。以下是一些卸载顽固...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。这个方法是由垃圾收集器在确定这...
  • windows用户称拦截api

    2015-04-06 17:22:24
    不过大部分原理都是修改程序流程,使之跳转到你要执行的地方,然后再返回到原地址.原来api的功能必须还实现.否则拦截就失去作用了.修改文件导入表的方法的缺点是如果用户程序动态加载(使用LoadLibrary和...
  • java 面试题 总结

    2009-09-16 08:45:34
    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface什么区别? 声明方法...
  • 网上搜答案也是五花八门,希望大家推荐一个内存优化参数文章 另外我上面设置参数哪些方面可以优化,或者哪些地方写不对。 <br />核心代码我都贴到下面:(我是刚入门菜鸟,大家别笑话我写...
  • 博客主要关注于java,并发,多线程,大数据,区块链,架构,人工智能等方面,一时间就会更新。 下面分享几个我总结规划脑图,博客写作会参照这些脑图慢慢完善,欢迎大家关注和star,感兴趣朋友也可以...
  • x-scan-v3.3-cn

    2013-09-23 21:36:56
    扫描器停止响应是很正常可能是因为使用者连接的线程过多,本地系统资源不足而造成系统瘫痪、也可能是因为对方服务器响应比较慢,依次发送出去请求被同时反送回来而造成信息阻塞、还有可能是服务器安装了...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! GMem 内存管理单元源码。GMem.cpp和GMem.h是内存管理...
  • vc++ 开发实例源码包

    2014-12-16 11:25:17
    这个例子就是查询任何可执行文件版本信息并且 C++builder 和 VC 都通用,只需要把 AnsiString 替换成 CString 就行了。 gh0st v3.6 源码 - 可下断点调试! 如题。详细见源码。 GMem 内存管理单元源码。GMem.cpp...
  • c#学习笔记.txt

    2008-12-15 14:01:21
    volatile指示字段可由操作系统、硬件或并发执行的线程等在程序中进行修改。 9,语句 语句是程序指令。除非特别说明,语句都按顺序执行。C# 具有下列类别的语句。 类别C# 关键字 选择语句if, else, switch, case 迭代...
  • C#微软培训教材(高清PDF)

    千次下载 热门讨论 2009-07-30 08:51:17
    C#--微软.NET第一语言 本书着重介绍语言本身,比较少涉及应用,不错入门书,从头讲起,不怕不明白。 <<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 ...
  • 让出控制权意味着停止执行当前任务,浏览器去执行其他任务,随后再回来继续执行没有执行完任务。 所以时间切片目的是不阻塞主线程,而实现目的技术手段是将一个长任务拆分成很多个不超过...
  • C#微软培训资料

    2014-01-22 14:10:17
    以互相交换组件地方以互相交换组件地方 以互相交换组件地方 比尔 比尔比尔 比尔.盖茨 盖茨盖茨 盖茨 在本章中你将了解 Microsoft.NET 概念 .NET 框架 C#语言在.NET 框架中作用及其特性...
  • rar压缩软件.rar

    2016-02-13 10:52:44
    RAR 是一个你在命令行模式中管理压缩文件控制台应用。RAR 提供压缩、加 密、数据恢复和许多其它此手册中描述其它功能。 RAR 只支持 RAR 格式压缩文件,它默认 .rar 扩展名。不支持ZIP 和其他格 式。即使...
  • 下面我们就介绍几种使系统变慢病毒。  1、使系统变慢bride病毒  病毒类型:黑客程序  发作时间:随机  传播方式:网络  感染对象:网络  警惕程度:★★★★  病毒介绍:  此病毒可以在...
  • 本书以案例形式讨论了使用调试技术解决复杂软件问题工具和方法...阅读这一篇将助于扩大读者知识面,并且了解关键细节,知识既广度又深度,所谓“致广大而尽精微”,因此这一篇取名为“致知”。 纵观四篇...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

下面能让线程停止执行的有