美文网首页
重温系列之多线程并发:线程方法

重温系列之多线程并发:线程方法

作者: 内卷星球 | 来源:发表于2019-03-30 17:59 被阅读0次
    image

    start

    线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。

    run-线程执行

    Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。

    wait-线程等待

    调用该方法的线程进入 WAITING 状态,只有等待另外线程的通知(notify/notifyAll)或被中断才会返回,需要注意的是调用 wait()方法后,会释放对象的锁。因此,wait 方法一般用在同步方法或同步代码块中。

    sleep-线程睡眠

    sleep 导致当前线程休眠,与 wait 方法不同的是 sleep 不会释放当前占有的锁,sleep(long)会导致线程进入 TIMED-WATING 状态,而 wait()方法会导致当前线程进入 WATING 状态

    yield-线程让步

    yield 会使当前线程让出 CPU 执行时间片,与其他线程一起重新竞争 CPU 时间片。一般情况下,优先级高的线程有更大的可能性成功竞争得到 CPU 时间片,但这又不是绝对的,有的操作系统对线程优先级并不敏感

    interrupt-线程中断

    中断一个线程,其本意是给这个线程一个通知信号,会影响这个线程内部的一个中断标识位。这个线程本身并不会因此而改变状态(如阻塞,终止等)

    1. 调用 interrupt()方法并不会中断一个正在运行的线程。也就是说处于 Running 状态的线程并不会因为被中断而被终止,仅仅改变了内部维护的中断标识位而已
    2. 若调用 sleep()而使线程处于 TIMED-WATING 状态,这时调用interrupt()方法,会抛出InterruptedException,从而使线程提前结束 TIMED-WATING 状态。
    3. 许多声明抛出 InterruptedException 的方法(如Thread.sleep(long mills 方法)),抛出异常前,都会清除中断标识位,所以抛出异常后,调用isInterrupted()方法将会返回 false。
    4. 中断状态是线程固有的一个标识位,可以通过此标识位安全的终止线程。比如,你想终止一个线程thread的时候,可以调用thread.interrupt()方法,在线程的run方法内部可以根据 thread.isInterrupted()的值来优雅的终止线程

    join-等待线程终止

    join(0)的意思不是A线程等待B线程0秒,而是A线程等待B线程无限时间,直到B线程执行完毕,即join(0)等价于join();
    join(10),则表示A线程会等待B线程执行10毫秒,10毫秒过后,A、B线程并行执行

    join() 方法,放弃当前线程的执行,等待其他线程终止,在当前线程中调用一个线程的 join() 方法,则当前线程转为阻塞状态,等到另一个线程结束,当前线程再由阻塞状态变为就绪状态,等待 cpu

    notify

    Object 类中的 notify() 方法,唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个 wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程

    其他方法

    1. sleep():强迫一个线程睡眠N毫秒。
    2. isAlive(): 判断一个线程是否存活。
    3. join(): 等待线程终止。
    4. activeCount(): 程序中活跃的线程数。
    5. enumerate(): 枚举程序中的线程。
    6. currentThread(): 得到当前线程。
    7. isDaemon(): 一个线程是否为守护线程。
    8. setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束)
    9. setName(): 为线程设置一个名称。
    10. wait(): 强迫一个线程等待。
    11. notify(): 通知一个线程继续运行。
    12. setPriority(): 设置一个线程的优先级。
    13. getPriority(): 获得一个线程的优先级

    sleep和wait的区别

    1. sleep方法属于Thread类,wait方法属于Object类
    2. sleep()方法导致了程序暂停执行指定的时间,让出 cpu给其他线程,但是监控状态依然保持着,当指定的时间到了又会自动恢复运行状态
    3. 在调用 sleep()方法的过程中,线程不会释放对象锁
    4. 而当调用 wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用 notify()/notifyAll()方法后本线程才进入对象锁定池准备获取对象锁进入运行状态

    start与run区别

    1. start()方法来启动线程,真正实现了多线程运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面的代码
    2. 通过调用 Thread 类的 start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行
    3. 方法 run()称为线程体,它包含了要执行的这个线程的内容,线程就进入了运行状态,开始运行 run 函数当中的代码。 Run 方法运行结束, 此线程终止。然后 CPU 再调度其它线程

    相关文章

      网友评论

          本文标题:重温系列之多线程并发:线程方法

          本文链接:https://www.haomeiwen.com/subject/rnjsbqtx.html