
多线程
多线程部分的文章是我的读书笔记,主要是《Java并发编程之美》这本书,后续会补充其它书籍内容。
Tim·Z
Java程序员
展开
-
java之线程死锁的原因,避免死锁的方式
线程死锁线程死锁的现象两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下,这些线程会一直互相等待而无法继续运行下去.线程死锁的四个条件互斥条件资源只能被一个线程占用,如果其它线程请求获取该资源,则请求者只能等待,直到占用资源的线程释放该资源.请求并持有条件指一个线程已经持有了至少一个资源,但又提出了新的资源请求,而新的资源已被其他线程占用,所以当前线程会被阻塞,但阻塞的同时不释放自己获取的资源.不可剥夺条件获取到的资源在自己使用完之前不能被原创 2020-10-18 17:29:50 · 212 阅读 · 2 评论 -
java之理解线程上下文切换
理解线程上下文切换线程的执行需要CPU资源,每个CPU同一时刻只能被一个线程使用,为了让用户感觉多个线程是在同时执行的,CPU资源采用了时间片轮转的策略,也就是给每个线程分配一个时间片,线程在时间片内占用CPU执行任务。当线程使用完时间片之后,如果还未结束,就会处于就绪状态并让出CPU给其他线程使用,这就是上下文切换,从当前线程的上下文切换到其它线程。思考一个问题,让出CPU的线程当下次轮到自己占用CPU时间片的时候如何知道自己之前运行到哪里了?所以在切换线程上下文的时候需要保存当前线程的执行现场,当再原创 2020-10-18 16:21:45 · 364 阅读 · 0 评论 -
java线程中断的关键API介绍及使用场景说明
线程中断的方式Java提供了线程的中断机制:设置线程的中断标志,我们可以使用它来结束一个线程。通过设置线程的中断标志并不能直接终止该线程的执行,这种机制要求线程自己检查它是否被中断了,然后决定是不是要相应这个中断请求。线程中断相关的APIvoid interrupt():中断线程,例如线程A运行时,线程B可以调用线程A的interrupt方法来设置线程A的中断标志位true。注意:这里仅仅是设置了标志,线程A并没有中断,它会继续往下执行。如果线程A调用了wait系列函数,join方法或sleep方法原创 2020-10-09 23:28:19 · 704 阅读 · 0 评论 -
java让出CPU执行权的yield方法
Thread类的yield方法介绍Thread类有一个静态的yield方法;操作系统是为每个线程分配一个时间片来占有CPU的,正常情况下当一个线程把分配给自己的时间片使用完之后,线程调度器才会进行下一轮的线程调度;当一个线程调用了Thread类静态的yield方法时,是在告诉线程调度器自己占有的时间片还没有用完的部分自己不想再用了,是在暗示线程调度器现在就可以进行下一轮的线程调度了。但是线程调度器可以忽略这个暗示;yield示范当一个线程调用yield方法时,当前线程会让出CPU使用权,然后处于原创 2020-10-09 21:01:37 · 529 阅读 · 0 评论 -
java线程休眠之sleep
Sleep方法介绍sleep方法是Thread类中的一个静态方法,当一个执行中的线程调用了Thread的sleep方法之后,调用线程会暂时让出指定时间的执行权,这期间不参与CPU的调度,但是该线程所拥有的监视器资源,比如锁还是持有且不让出的。指定的睡眠时间到了之后,sleep函数会正常返回,线程就处于就绪状态,然后参与CPU调度,获取到CPU的资源后就可以运行了。线程睡眠时不释放拥有的监视器资源import java.util.concurrent.locks.Lock;import java.ut原创 2020-10-08 16:23:02 · 876 阅读 · 0 评论 -
java等待线程执行终止的join方法
join方法介绍join方法是Thread类的方法,不是Object对象的方法,是无参的且返回值为void的方法。等待子线程执行完成,再继续执行主线程来看一个示范:package com.tim.base.easystart.thread.base;public class JoinTest { public static void main(String[] args) throws InterruptedException { System.out.println("main t原创 2020-10-08 14:56:40 · 665 阅读 · 0 评论 -
java线程的等待与通知
线程的等待与通知wait()函数使用的时候要注意,要调用共享变量对象的wait()方法,必须先获取该对象的Monitor。否则会抛出IllegalMonitorStateException;当调用一个共享变量的wait()方法时,该调用线程会被阻塞挂起,直到:1)其他线程调用了该共享变量的notify()或notifyAll()方法;2)其他线程调用了该线程的interrupt()方法,该线程抛出InterruptedException异常返回。import java.util.PriorityQu原创 2020-10-07 23:00:17 · 457 阅读 · 0 评论 -
java线程的创建与运行
继承Thread类的方式使用继承的方式,可以方便的处理参数,在自定义的线程类里面可以添加成员变量,通过构造函数或者set方法来给变量设置值。public class ThreadTest { public static class MyThread extends Thread { private String info = ""; public MyThread() {} public MyThread(String info) { this.info =原创 2020-10-06 20:45:28 · 131 阅读 · 0 评论 -
wait()-虚假唤醒
public class SpuriousWakeUpTest { private final Object lock = new Object(); private int product = 0; private void produce() { synchronized (lock) { product = product + 1; lock.notify(); } } private v原创 2020-09-22 08:34:08 · 446 阅读 · 0 评论 -
spurious wakeup 虚假唤醒
多线程编程中条件变量和的spurious wakeup 虚假唤醒1. 概述条件变量(condition variable)是利用共享的变量进行线程之间同步的一种机制。典型的场景包括生产者-消费者模型,线程池实现等。对条件变量的使用包括两个动作:1) 线程等待某个条件, 条件为真则继续执行,条件为假则将自己挂起(避免busy wait,节省CPU资源);2) 线程执行某些处理之后,条件成立;则通知等待该条件的线程继续执行。3) 为了防止race-condition,条件变量总是和互斥锁...转载 2020-09-11 08:25:46 · 539 阅读 · 0 评论