zoukankan      html  css  js  c++  java
  • JAVA多线程面试题目

    1,java中有几种方法可以实现一个线程?

    答:在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法。这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。

    常见错误:调用run()方法而非start()方法
    创建并运行一个线程所犯的常见错误是调用线程的run()方法而非start()方法,如下所示:

    Thread newThread = new Thread(MyRunnable());
    newThread.run();

    起初你并不会感觉到有什么不妥,因为run()方法的确如你所愿的被调用了。但是,事实上,run()方法并非是由刚创建的新线程所执行的,而是被创建新线程的当前线程所执行了。也就是被执行上面两行代码的线程所执行的。想要让创建的新线程执行run()方法,必须调用新线程的start方法。

    2,如何停止一个正在运行的线程?

    答:当不阻塞时候设置一个标志位,让代码块正常运行结束并停止线程。

          如果发生了阻塞,用interupt()方法,Thread.interrupt()方法不会中断一个正在运行的线程。

    3,notify()和notifyAll()有什么区别?

    答:1)notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。
          2)void notify(): 唤醒一个正在等待该对象的线程。
          3)void notifyAll(): 唤醒所有正在等待该对象的线程。
    两者的最大区别在于:
    notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
    notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运 行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的 通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。

  • 相关阅读:
    周易:简易、变易、不易
    2018.net面试题汇总
    关于《推荐系统实践》
    设计模式指引
    facebook的工程开发,不得不佩服
    eclipse自动补全的设置
    数据智慧工程师——计算机和人类之间的中间人——如何从数据中获取有价值的知识
    (移动位置社会网络中)LBSN:好友关系对人类活动的影响分析
    加快软件开发速度,eclipse最常用的快捷键
    人生是一对一的搏斗
  • 原文地址:https://www.cnblogs.com/pingh/p/3502911.html
Copyright © 2011-2022 走看看