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

    调试意味着就是要main线程挂起来

    线程一定要调用start启动,run是被java虚拟机调度的

    start显示被调用的好处就是一个对象可以作为线程来运行

     Runable可以当做一个在属性上共享方式而存在的线程,无需Thread方式共享

    http://jingyan.baidu.com/article/e6c8503c2a32e2e54f1a1831.html

    后面不是很好理解

    4.java线程常用方法

     

     

    ,分别是新建,可运行,运行中,睡眠,阻塞,等待,死亡。【也可以五个,便于识记】

    2.setPriority(int newPriority)方法

    设置线程的优先级:线程默认的优先级是创建它的执行线程的优先级。

    线程优先级为1~10之间的正整数,JVM从不会改变一个线程的优先级。然而,1~10之间的值是没有保证的。一些JVM可能不能识别10个不同的值,而将这些优先级进行每两个或多个合并,变成少于10个的优先级,则两个或多个优先级的线程可能被映射为一个优先级。

    线程默认优先级是5,Thread类中有三个常量,定义线程优先级范围:

    static int MAX_PRIORITY
              线程可以具有的最高优先级。 
    static int MIN_PRIORITY
              线程可以具有的最低优先级。 
    static int NORM_PRIORITY
              分配给线程的默认优先级。 

    3Thread.yield()方法,放弃的意思

    Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。

    yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

    结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。 

    4join()方法

    Thread的非静态方法join()让一个线程B“加入”到另外一个线程A的尾部。在A执行完毕之前,B不能工作。

    1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

    sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

    【如果是调用Thread.sleep(10);】【实例也是可以调用静态方法的,静态则不能使用实例】
    2、最主要sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

    sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

    Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

    wait和notify【wait相对于notify是释放锁,让出CPU】

    wait()和notify()一系列的方法,是属于对象的,不是属于线程的。在synchronized语句块中,同一个对象,一个线程在执行完这一块代码之前,同一个对象是不能同时被两个线程用来进入synchronized中的。这就是线程同步。

    wait()意思是说,我等会儿再用这把锁,CPU也让给你们,我先休息一会儿!

    notify()意思是说,我用完了,你们谁用?

    wait()会让出对象锁,同时,当前线程休眠,等待被唤醒,如果不被唤醒,就一直等在那儿。

    notify()在多个锁的情况下,b.notify只是唤醒拥有B对象锁的线程,a锁被释放

     【重解释下join和yield】

    在t2实现体中,t1.join则是让t2进入堵塞状态,而yield相反,自己让出给t2运行

     

    概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式。前者仅提供一份变量,让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同时访问而互不影响。 

  • 相关阅读:
    Spring Boot
    Spring Boot – Jetty配置
    如何使ESLint在Visual Studio 2019和2017中工作: 2019 v16和2017> = v15.8
    CentOS 7 安装 Nginx
    HTTPS-使用Certbot自动配置Let’s Encrypt证书
    centos7升级内核到最新版本
    [C#.net]Connection Timeout和Command Timeout
    Redis中切换db
    Redis 模糊查询删除操作
    [Abp vNext 源码分析]
  • 原文地址:https://www.cnblogs.com/chenxuezhouLearnProgram/p/5697029.html
Copyright © 2011-2022 走看看