作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:

  1. SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然。
  2. 因为没有容量,所以对应 peek, contains, clear, isEmpty … 等方法其实是无效的。例如clear是不执行任何操作的,contains始终返回false,peek始终返回null。
  3. SynchronousQueue分为公平和非公平,默认情况下采用非公平性访问策略,当然也可以通过构造函数来设置为公平性访问策略(为true即可)。
  4. 若使用 TransferQueue, 则队列中永远会存在一个 dummy node(这点后面详细阐述)。

SynchronousQueue非常适合做交换工作,生产者的线程和消费者的线程同步以传递某些信息、事件或者任务。

SynchronousQueue

与其他BlockingQueue一样,SynchronousQueue同样继承AbstractQueue和实现BlockingQueue接口:

public class SynchronousQueue<E> extends AbstractQueue<E>implements BlockingQueue<E>, java.io.Serializable

SynchronousQueue提供了两个构造函数:

 public SynchronousQueue() {this(false);}public SynchronousQueue(boolean fair) {// 通过 fair 值来决定公平性和非公平性// 公平性使用TransferQueue,非公平性采用TransferStacktransferer = fair ? new TransferQueue<E>() : new TransferStack<E>();}

TransferQueue、TransferStack继承Transferer,Transferer为SynchronousQueue的内部类,它提供了一个方法transfer(),该方法定义了转移数据的规范,如下:

 abstract static class Transferer<E> {abstract E transfer(E e, boolean timed, long nanos);}

transfer()方法主要用来完成转移数据的,如果e != null,相当于将一个数据交给消费者,如果e == null,则相当于从一个生产者接收一个消费者交出的数据。

SynchronousQueue采用队列TransferQueue来实现公平性策略,采用堆栈TransferStack来实现非公平性策略,他们两种都是通过链表实现的,其节点分别为QNode,SNode。TransferQueue和TransferStack在SynchronousQueue中扮演着非常重要的作用,SynchronousQueue的put、take操作都是委托这两个类来实现的。

TransferQueue

TransferQueue是实现公平性策略的核心类,其节点为QNode,其定义如下:

 static final class TransferQueue<E> extends Transferer<E> {/** 头节点 */transient volatile QNode head;/** 尾节点 */transient volatile QNode tail;// 指向一个取消的结点//当一个节点中最后一个插入时,它被取消了但是可能还没有离开队列transient volatile QNode cleanMe;/*** 省略很多代码O(∩_∩)O*/}

在TransferQueue中除了头、尾节点外还存在一个cleanMe节点。该节点主要用于标记,当删除的节点是尾节点时则需要使用该节点。

同时,对于TransferQueue需要注意的是,其队列永远都存在一个dummy node,在构造时创建:

 TransferQueue() {QNode h = new QNode(null, false); // initialize to dummy node.head = h;tail = h;}

在TransferQueue中定义了QNode类来表示队列中的节点,QNode节点定义如下:

static final class QNode {// next 域volatile QNode next;// item数据项volatile Object item;//  等待线程,用于park/unparkvolatile Thread waiter;       // to control park/unpark//模式,表示当前是数据还是请求,只有当匹配的模式相匹配时才会交换final boolean isData;QNode(Object item, boolean isData) {this.item = item;this.isData = isData;}/*** CAS next域,在TransferQueue中用于向next推进*/boolean casNext(QNode cmp, QNode val) {return next == cmp &&UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);}/*** CAS itme数据项*/boolean casItem(Object cmp, Object val) {return item == cmp &&UNSAFE.compareAndSwapObject(this, itemOffset, cmp, val);}/***  取消本结点,将item域设置为自身*/void tryCancel(Object cmp) {UNSAFE.compareAndSwapObject(this, itemOffset, cmp, this);}/*** 是否被取消* 与tryCancel相照应只需要判断item释放等于自身即可*/boolean isCancelled() {return item == this;}boolean isOffList() {return next == this;}private static final sun.misc.Unsafe UNSAFE;private static final long itemOffset;private static final long nextOffset;static {try {UNSAFE = sun.misc.Unsafe.getUnsafe();Class<?> k = QNode.class;itemOffset = UNSAFE.objectFieldOffset(k.getDeclaredField("item"));nextOffset = UNSAFE.objectFieldOffset(k.getDeclaredField("next"));} catch (Exception e) {throw new Error(e);}}}

上面代码没啥好看的,需要注意的一点就是isData,该属性在进行数据交换起到关键性作用,两个线程进行数据交换的时候,必须要两者的模式保持一致。

TransferStack

TransferStack用于实现非公平性,定义如下:

static final class TransferStack<E> extends Transferer<E> {static final int REQUEST    = 0;static final int DATA       = 1;static final int FULFILLING = 2;volatile SNode head;/*** 省略一堆代码  O(∩_∩)O~*/}

TransferStack中定义了三个状态:REQUEST表示消费数据的消费者,DATA表示生产数据的生产者,FULFILLING,表示匹配另一个生产者或消费者。任何线程对TransferStack的操作都属于上述3种状态中的一种(对应着SNode节点的mode)。同时还包含一个head域,表示头结点。

内部节点SNode定义如下:

static final class SNode {// next 域volatile SNode next;// 相匹配的节点volatile SNode match;// 等待的线程volatile Thread waiter;// item 域Object item;                // data; or null for REQUESTs// 模型int mode;/*** item域和mode域不需要使用volatile修饰,因为它们在volatile/atomic操作之前写,之后读*/SNode(Object item) {this.item = item;}boolean casNext(SNode cmp, SNode val) {return cmp == next &&UNSAFE.compareAndSwapObject(this, nextOffset, cmp, val);}/*** 将s结点与本结点进行匹配,匹配成功,则unpark等待线程*/boolean tryMatch(SNode s) {if (match == null &&UNSAFE.compareAndSwapObject(this, matchOffset, null, s)) {Thread w = waiter;if (w != null) {    // waiters need at most one unparkwaiter = null;LockSupport.unpark(w);}return true;}return match == s;}void tryCancel() {UNSAFE.compareAndSwapObject(this, matchOffset, null, this);}boolean isCancelled() {return match == this;}// Unsafe mechanicsprivate static final sun.misc.Unsafe UNSAFE;private static final long matchOffset;private static final long nextOffset;static {try {UNSAFE = sun.misc.Unsafe.getUnsafe();Class<?> k = SNode.class;matchOffset = UNSAFE.objectFieldOffset(k.getDeclaredField("match"));nextOffset = UNSAFE.objectFieldOffset(k.getDeclaredField("next"));} catch (Exception e) {throw new Error(e);}}}

上面简单介绍了TransferQueue、TransferStack,由于SynchronousQueue的put、take操作都是调用Transfer的transfer()方法,只不过是传递的参数不同而已,put传递的是e参数,所以模式为数据(公平isData = true,非公平mode= DATA),而take操作传递的是null,所以模式为请求(公平isData = false,非公平mode = REQUEST),如下:

// put操作public void put(E e) throws InterruptedException {if (e == null) throw new NullPointerException();if (transferer.transfer(e, false, 0) == null) {Thread.interrupted();throw new InterruptedException();}}// take操作public E take() throws InterruptedException {E e = transferer.transfer(null, false, 0);if (e != null)return e;Thread.interrupted();throw new InterruptedException();}

公平模式

公平性调用TransferQueue的transfer方法:

E transfer(E e, boolean timed, long nanos) {QNode s = null;// 当前节点模式boolean isData = (e != null);for (;;) {QNode t = tail;QNode h = head;// 头、尾节点 为null,没有初始化if (t == null || h == null)continue;// 头尾节点相等(队列为null) 或者当前节点和队列节点模式一样if (h == t || t.isData == isData) {// tn = t.nextQNode tn = t.next;// t != tail表示已有其他线程操作了,修改了tail,重新再来if (t != tail)continue;// tn != null,表示已经有其他线程添加了节点,tn 推进,重新处理if (tn != null) {// 当前线程帮忙推进尾节点,就是尝试将tn设置为尾节点advanceTail(t, tn);continue;}//  调用的方法的 wait 类型的, 并且 超时了, 直接返回 null// timed 在take操作阐述if (timed && nanos <= 0)return null;// s == null,构建一个新节点Nodeif (s == null)s = new QNode(e, isData);// 将新建的节点加入到队列中,如果不成功,继续处理if (!t.casNext(null, s))continue;// 替换尾节点advanceTail(t, s);// 调用awaitFulfill, 若节点是 head.next, 则进行自旋// 若不是的话, 直接 block, 直到有其他线程 与之匹配, 或它自己进行线程的中断Object x = awaitFulfill(s, e, timed, nanos);// 若返回的x == s表示,当前线程已经超时或者中断,不然的话s == null或者是匹配的节点if (x == s) {// 清理节点Sclean(t, s);return null;}// isOffList:用于判断节点是否已经从队列中离开了if (!s.isOffList()) {// 尝试将S节点设置为head,移出tadvanceHead(t, s);if (x != null)s.item = s;// 释放线程 refs.waiter = null;}// 返回return (x != null) ? (E)x : e;}// 这里是从head.next开始,因为TransferQueue总是会存在一个dummy node节点else {// 节点QNode m = h.next;// 不一致读,重新开始// 有其他线程更改了线程结构if (t != tail || m == null || h != head)continue;/*** 生产者producer和消费者consumer匹配操作*/Object x = m.item;// isData == (x != null):判断isData与x的模式是否相同,相同表示已经匹配了// x == m :m节点被取消了// !m.casItem(x, e):如果尝试将数据e设置到m上失败if (isData == (x != null) ||  x  == m || !m.casItem(x, e)) {// 将m设置为头结点,h出列,然后重试advanceHead(h, m);continue;}// 成功匹配了,m设置为头结点h出列,向前推进advanceHead(h, m);// 唤醒m上的等待线程LockSupport.unpark(m.waiter);return (x != null) ? (E)x : e;}}}

整个transfer的算法如下:

  1. 如果队列为null或者尾节点模式与当前节点模式一致,则尝试将节点加入到等待队列中(采用自旋的方式),直到被匹配或、超时或者取消。匹配成功的话要么返回null(producer返回的)要么返回真正传递的值(consumer返回的),如果返回的是node节点本身则表示当前线程超时或者取消了。
  2. 如果队列不为null,且队列的节点是当前节点匹配的节点,则进行数据的传递匹配并返回匹配节点的数据
  3. 在整个过程中都会检测并帮助其他线程推进

当队列为空时,节点入列然后通过调用awaitFulfill()方法自旋,该方法主要用于自旋/阻塞节点,直到节点被匹配返回或者取消、中断。

Object awaitFulfill(QNode s, E e, boolean timed, long nanos) {// 超时控制final long deadline = timed ? System.nanoTime() + nanos : 0L;Thread w = Thread.currentThread();// 自旋次数// 如果节点Node恰好是head节点,则自旋一段时间,这里主要是为了效率问题,如果里面阻塞,会存在唤醒、线程上下文切换的问题// 如果生产者、消费者者里面到来的话,就避免了这个阻塞的过程int spins = ((head.next == s) ?(timed ? maxTimedSpins : maxUntimedSpins) : 0);// 自旋for (;;) {// 线程中断了,剔除当前节点if (w.isInterrupted())s.tryCancel(e);// 如果线程进行了阻塞 -> 唤醒或者中断了,那么x != e 肯定成立,直接返回当前节点即可Object x = s.item;if (x != e)return x;// 超时判断if (timed) {nanos = deadline - System.nanoTime();// 如果超时了,取消节点,continue,在if(x != e)肯定会成立,直接返回xif (nanos <= 0L) {s.tryCancel(e);continue;}}// 自旋- 1if (spins > 0)--spins;// 等待线程else if (s.waiter == null)s.waiter = w;// 进行没有超时的 parkelse if (!timed)LockSupport.park(this);// 自旋次数过了, 直接 + timeout 方式 parkelse if (nanos > spinForTimeoutThreshold)LockSupport.parkNanos(this, nanos);}}

在自旋/阻塞过程中做了一点优化,就是判断当前节点是否为对头元素,如果是的则先自旋,如果自旋次数过了,则才阻塞,这样做的主要目的就在如果生产者、消费者立马来匹配了则不需要阻塞,因为阻塞、唤醒会消耗资源。在整个自旋的过程中会不断判断是否超时或者中断了,如果中断或者超时了则调用tryCancel()取消该节点。

tryCancel

 void tryCancel(Object cmp) {UNSAFE.compareAndSwapObject(this, itemOffset, cmp, this);}

取消过程就是将节点的item设置为自身(itemOffset是item的偏移量)。所以在调用awaitFulfill()方法时,如果当前线程被取消、中断、超时了那么返回的值肯定时S,否则返回的则是匹配的节点。如果返回值是节点S,那么if(x == s)必定成立,如下:

   Object x = awaitFulfill(s, e, timed, nanos);if (x == s) {                   // wait was cancelledclean(t, s);return null;}

如果返回的x == s成立,则调用clean()方法清理节点S:

void clean(QNode pred, QNode s) {//s.waiter = null;while (pred.next == s) {QNode h = head;QNode hn = h.next;// hn节点被取消了,向前推进if (hn != null && hn.isCancelled()) {advanceHead(h, hn);continue;}// 队列为空,直接return nullQNode t = tail;if (t == h)return;QNode tn = t.next;// 不一致,说明有其他线程改变了tail节点,重新开始if (t != tail)continue;// tn != null 推进tail节点,重新开始if (tn != null) {advanceTail(t, tn);continue;}// s 不是尾节点 移出if (s != t) {QNode sn = s.next;// 如果s已经被移除退出循环,否则尝试断开sif (sn == s || pred.casNext(s, sn))return;}// s是尾节点,则有可能会有其他线程在添加新节点,则cleanMe出场QNode dp = cleanMe;// 如果dp不为null,说明是前一个被取消节点,将其移除if (dp != null) {QNode d = dp.next;QNode dn;if (d == null ||               // 节点d已经删除d == dp ||                 // 原来的节点 cleanMe 已经通过 advanceHead 进行删除!d.isCancelled() ||        // 原来的节点 s已经删除(d != t &&                 // d 不是tail节点(dn = d.next) != null &&  //dn != d &&                //   that is on listdp.casNext(d, dn)))       // d unspliced// 清除 cleanMe 节点, 这里的 dp == pred 若成立, 说明清除节点s,成功, 直接return, 不然的话要再次循环casCleanMe(dp, null);if (dp == pred)return;} else if (casCleanMe(null, pred))  // 原来的 cleanMe 是 null, 则将 pred 标记为 cleamMe 为下次 清除 s 节点做标识return;}}

这个clean()方法感觉有点儿难度,我也看得不是很懂。这里是引用http://www.jianshu.com/p/95cb570c8187

  1. 删除的节点不是queue尾节点, 这时 直接 pred.casNext(s, s.next) 方式来进行删除(和ConcurrentLikedQueue中差不多)
  2. 删除的节点是队尾节点
  • 此时 cleanMe == null, 则 前继节点pred标记为 cleanMe, 为下次删除做准备
  • 此时 cleanMe != null, 先删除上次需要删除的节点, 然后将 cleanMe至null, 让后再将 pred 赋值给 cleanMe

非公平模式

非公平模式transfer方法如下:

 E transfer(E e, boolean timed, long nanos) {SNode s = null; // constructed/reused as neededint mode = (e == null) ? REQUEST : DATA;for (;;) {SNode h = head;// 栈为空或者当前节点模式与头节点模式一样,将节点压入栈内,等待匹配if (h == null || h.mode == mode) {// 超时if (timed && nanos <= 0) {// 节点被取消了,向前推进if (h != null && h.isCancelled())//  重新设置头结点(弹出之前的头结点)casHead(h, h.next);elsereturn null;}// 不超时// 生成一个SNode节点,并尝试替换掉头节点head (head -> s)else if (casHead(h, s = snode(s, e, h, mode))) {// 自旋,等待线程匹配SNode m = awaitFulfill(s, timed, nanos);// 返回的m == s 表示该节点被取消了或者超时、中断了if (m == s) {// 清理节点S,return nullclean(s);return null;}// 因为通过前面一步将S替换成了head,如果h.next == s ,则表示有其他节点插入到S前面了,变成了head// 且该节点就是与节点S匹配的节点if ((h = head) != null && h.next == s)// 将s.next节点设置为head,相当于取消节点h、scasHead(h, s.next);// 如果是请求则返回匹配的域,否则返回节点S的域return (E) ((mode == REQUEST) ? m.item : s.item);}}// 如果栈不为null,且两者模式不匹配(h != null && h.mode != mode)// 说明他们是一队对等匹配的节点,尝试用当前节点s来满足h节点else if (!isFulfilling(h.mode)) {// head 节点已经取消了,向前推进if (h.isCancelled())casHead(h, h.next);// 尝试将当前节点打上"正在匹配"的标记,并设置为headelse if (casHead(h, s=snode(s, e, h, FULFILLING|mode))) {// 循环loopfor (;;) {// s为当前节点,m是s的next节点,// m节点是s节点的匹配节点SNode m = s.next;// m == null,其他节点把m节点匹配走了if (m == null) {// 将s弹出casHead(s, null);// 将s置空,下轮循环的时候还会新建s = null;// 退出该循环,继续主循环break;}// 获取m的next节点SNode mn = m.next;// 尝试匹配if (m.tryMatch(s)) {// 匹配成功,将s 、 m弹出casHead(s, mn);     // pop both s and mreturn (E) ((mode == REQUEST) ? m.item : s.item);} else// 如果没有匹配成功,说明有其他线程已经匹配了,把m移出s.casNext(m, mn);}}}// 到这最后一步说明节点正在匹配阶段else {// head 的next的节点,是正在匹配的节点,m 和 h配对SNode m = h.next;// m == null 其他线程把m节点抢走了,弹出h节点if (m == null)casHead(h, null);else {SNode mn = m.next;if (m.tryMatch(h))casHead(h, mn);elseh.casNext(m, mn);}}}}

整个处理过程分为三种情况,具体如下:

  1. 如果当前栈为空获取节点模式与栈顶模式一样,则尝试将节点加入栈内,同时通过自旋方式等待节点匹配,最后返回匹配的节点或者null(被取消)
  2. 如果栈不为空且节点的模式与首节点模式匹配,则尝试将该节点打上FULFILLING标记,然后加入栈中,与相应的节点匹配,成功后将这两个节点弹出栈并返回匹配节点的数据
  3. 如果有节点在匹配,那么帮助这个节点完成匹配和出栈操作,然后在主循环中继续执行

当节点加入栈内后,通过调用awaitFulfill()方法自旋等待节点匹配:

SNode awaitFulfill(SNode s, boolean timed, long nanos) {// 超时final long deadline = timed ? System.nanoTime() + nanos : 0L;// 当前线程Thread w = Thread.currentThread();// 自旋次数// shouldSpin 用于检测当前节点是否需要自旋// 如果栈为空、该节点是首节点或者该节点是匹配节点,则先采用自旋,否则阻塞int spins = (shouldSpin(s) ?(timed ? maxTimedSpins : maxUntimedSpins) : 0);for (;;) {// 线程中断了,取消该节点if (w.isInterrupted())s.tryCancel();// 匹配节点SNode m = s.match;// 如果匹配节点m不为空,则表示匹配成功,直接返回if (m != null)return m;// 超时if (timed) {nanos = deadline - System.nanoTime();// 节点超时,取消if (nanos <= 0L) {s.tryCancel();continue;}}// 自旋;每次自旋的时候都需要检查自身是否满足自旋条件,满足就 - 1,否则为0if (spins > 0)spins = shouldSpin(s) ? (spins-1) : 0;// 第一次阻塞时,会将当前线程设置到s上else if (s.waiter == null)s.waiter = w;// 阻塞 当前线程else if (!timed)LockSupport.park(this);// 超时else if (nanos > spinForTimeoutThreshold)LockSupport.parkNanos(this, nanos);}}

awaitFulfill()方法会一直自旋/阻塞直到匹配节点。在S节点阻塞之前会先调用shouldSpin()方法判断是否采用自旋方式,为的就是如果有生产者或者消费者马上到来,就不需要阻塞了,在多核条件下这种优化是有必要的。同时在调用park()阻塞之前会将当前线程设置到S节点的waiter上。匹配成功,返回匹配节点m。

shouldSpin()方法如下:

 boolean shouldSpin(SNode s) {SNode h = head;return (h == s || h == null || isFulfilling(h.mode));}

同时在阻塞过程中会一直检测当前线程是否中断了,如果中断了,则调用tryCancel()方法取消该节点,取消过程就是将当前节点的math设置为当前节点。所以如果线程中断了,那么在返回m时一定是S节点自身。

    void tryCancel() {UNSAFE.compareAndSwapObject(this, matchOffset, null, this);}

awaitFullfill()方法如果返回的m == s,则表示当前节点已经中断取消了,则需要调用clean()方法,清理节点S:

 void clean(SNode s) {// 清理item域s.item = null;// 清理waiter域s.waiter = null;// past节点SNode past = s.next;if (past != null && past.isCancelled())past = past.next;// 从栈顶head节点,取消从栈顶head到past节点之间所有已经取消的节点// 注意:这里如果遇到一个节点没有取消,则会退出whileSNode p;while ((p = head) != null && p != past && p.isCancelled())casHead(p, p.next);     // 如果p节点已经取消了,则剔除该节点// 如果经历上面while p节点还没有取消,则再次循环取消掉所有p 到past之间的取消节点while (p != null && p != past) {SNode n = p.next;if (n != null && n.isCancelled())p.casNext(n, n.next);elsep = n;}}

clean()方法就是将head节点到S节点之间所有已经取消的节点全部移出。【不清楚为何要用两个while,一个不行么】

至此,SynchronousQueue的源码分析完成了,说下我个人感觉吧:个人感觉SynchronousQueue实现好复杂(可能是自己智商不够吧~~~~(>_<)~~~~),源码看了好久,这篇博客写了将近一个星期,如果有什么错误之处,烦请各位指正!!
 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. MyBaits入门完结篇,2021Java高级面试题汇总解答

    try{ LockDao lock sqlSession.getMapper(LockDao.class); Lock l1new Lock(); l1.setId(1); l1.setName("%锁"); l1.setPrice(1000); Lock l lock.getLockByCondition(l1); System.out.println(l); }finally { sqlSession.close(); } } } LockDao接…...

    2024/4/20 14:07:28
  2. 【JZOJ】1183:【入门】判断是否构成三角形

    #include <bits/stdc.h> using namespace std; int main() {int a,b,c;cin>>a>>b>>c;if(a>b){swap(a,b);}if(a>c) //使a最小 {swap(a,c);}if(b>c) //b中间&#xff0c;c最大 {swap(b,c);}if((ab)>c)cout<<"Yes";els…...

    2024/4/20 14:07:27
  3. 别逗了,费曼先生怪才历险记pdf

    下载地址:网盘下载 内容简介 本书中的这些故事,是我在和理查德 费曼高高兴兴打鼓的七年之间,零散而随意地积累起来的。我发现,每段故事,各有异趣,连掇成集,竟成大观。一个人的一辈子,竟然能发生这么多奇妙而发疯的事情,有时令人难以置信。那个人在他的一生中,…...

    2024/4/27 9:56:08
  4. 【JZOJ】1183判断是否构成三角形

    #include <bits/stdc.h> using namespace std; int main() {int a,b,c;cin>>a>>b>>c;if(a>b){swap(a,b);}if(a>c) //使a最小 {swap(a,c);}if(b>c) //b中间&#xff0c;c最大 {swap(b,c);}if((ab)>c)cout<<"Yes";els…...

    2024/4/20 14:07:25
  5. 多倍图解决方案

    物理像素和物理像素比 物理像素指的是屏幕显示的最小颗粒&#xff0c;比如电脑显示的1px像素大小。pc端页面&#xff0c;1个px等于1个物理像素&#xff0c;但是移动端就不尽相同1px能显示物理像素点的个数&#xff0c;称为物理像素比或屏幕像素比&#xff0c;大体意思就是&…...

    2024/4/21 17:03:28
  6. codeforces1228C Primes and Multiplication(快速幂/唯一分解定理)

    题目链接&#xff1a;codeforces 1228C 题目思路&#xff1a; f(x,y)f(x, y)f(x,y) 是所有 xxx 的质因子在 yyy 中出现次数的乘积&#xff0c;题目要求 111~nnn 的乘积&#xff0c;故对于每个质因子&#xff0c;统计其出现次数&#xff0c;再求乘积即可。 参考代码&#xff1…...

    2024/4/21 17:03:27
  7. 【LeetCode解题报告】《算法基础005_计数法》- Java

    目录一、唯一元素的和1.题目2.分析3.代码二、字符串中的第一个唯一字符1.题目2.分析3.代码三、检查是否所有字符出现次数相同1.题目2.分析3.代码四、找到所有数组中消失的数字1.题目2.分析3.代码五、好数对的数目1.题目2.分析3.代码六、大餐计数1.题目2.分析3.代码一、唯一元素…...

    2024/4/21 17:03:28
  8. Flink快速入门 I 统计单词出现次数

    公司项目需要使用Flink和FlinkCDC&#xff0c;但是大数据这堆常用中间件并没学过。所以可以一起学习下Flink&#xff01; 我们可以先启动一个 统计单词出现次数 的Demo来了解。 批处理模式 我们首先使用IDEA构建一个maven管理的Java空白项目。 导入下面依赖&#xff1a; &…...

    2024/4/21 17:03:25
  9. 修改植物大战僵尸游戏存档——跳关并快速实现财富自由

    任务&#xff1a; 1. 修改游戏存档&#xff0c;跳到5-1关卡。 2.游戏充值1024$ 3.解锁【迷你游戏】、【生存模式】选项 工具&#xff1a; 1. 植物大战僵尸客户端&#xff1a; 链接: https://pan.baidu.com/s/1aNyrPxklN8NViut3bC8LNg 提取码: lput 2. Hex Editor&#xf…...

    2024/4/27 4:24:36
  10. 数据结构之链表

    文章目录前言一、代码二、结果所示总结前言 本文记录的是链表的一些操作&#xff0c;例如链表的创建、排序、删除、求链表的长度、判断链表是否为空。以下内容是根据郝斌老师教导所写的代码。 一、代码 代码仅供参考&#xff0c;若有不足的地方&#xff0c;欢迎在评论区一起讨…...

    2024/4/21 17:03:24
  11. FPGA实现的SPI驱动(一)

    1、什么是SPI协议 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外围设备接口&#xff09;通讯协议&#xff0c;是 Motorola 公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据传输…...

    2024/4/29 7:19:12
  12. SpringMVC容器配置相关信息

    web.xml <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmlns.jcp.org/xml/ns/javae…...

    2024/4/24 19:41:18
  13. 重学python

    之前学习python&#xff0c;只学了基础和爬虫部分&#xff0c;没有实际的应用&#xff0c;所以学会了也很快忘记。 现在有了实际的需求&#xff0c;有目的地学&#xff0c;方向是量化交易&#xff0c;机器学习这块&#xff0c;主要应用于期货市场交易。 从头开始学起&#xf…...

    2024/4/21 17:03:21
  14. 一、架构设计概述

    一、架构设计概述需求分析辨别伪需求问题分层设计原则画架构图架构类别技巧传统架构图具体图的类别架构是一种能力&#xff0c;而不应该定义为一个岗位[格局.jpg]需求分析 边界 - 是否需要进行开发&#xff08;可否用已有的&#xff09; 用户故事 - 具体用户使用的场景&#x…...

    2024/4/27 5:04:04
  15. 七、通过zookeeper+dubbo实现服务监控与分配

    前言 先行概念 什么是rpc 很多人都会以为rpc是一种网络协议&#xff0c;实际上这种想法是非常错误的&#xff0c;笔者认为rpc协议应该说是一种通信协议的风格&#xff0c;与之相对应进行比较的不是http这种传输层协议&#xff0c;而是restful。 如下图所示&#xff0c;rpc协…...

    2024/4/29 20:17:54
  16. CSDN实训第一天 (游戏修改)

    CSDN实训第一天 &#xff08;游戏修改&#xff09; 一、前言 1. 背景 ​ 《植物大战僵尸》是一款极富策略性的游戏&#xff0c;可怕的僵尸即将入侵&#xff0c;防御方式就是栽种植物去对抗僵尸。此游戏集成了即时战略、塔防御战和紫卡片收集等要素、游戏的内容就是&#xff…...

    2024/4/27 2:34:19
  17. 【数字IC验证快速入门】40、UVM验证方法学(5)UVM基础之TestBench验证平台深入

    导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二…...

    2024/4/21 17:03:15
  18. JAVA数组,高级Java开发技术

    举例&#xff1a; 定义存储1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6整数的数组容器。 int[] arr new int[]{1,2,3,4,5,6}; 3.方式三 格式&#xff1a; 数据类型[] 数组名 {元素1,元素2,元素3…}; 举例&#xff1a; 定义存储1&#xff0c;2&am…...

    2024/4/21 17:03:14
  19. (ElasticSearch)es 权威指南 、 es参考手册API 、es 中文社区

    es权威指南-中文版 (电脑左侧栏为章节目录)kibana用户手册-中文版es中文社区es参考手册APIes客户端API...

    2024/4/30 12:18:53
  20. java架构师常见的基础面试题及答案(一),Java核心知识点

    九、HTTP 报文包含内容 请求方法包括GET,POST,HEAD,PUT,TRACE,OPTIONS,DELETE。请求头如&#xff1a;Host、User-Agent、Connection、Accept-Charset等。请求头部的最后会有一个空行&#xff0c;表示请求头部结束&#xff0c;接下来为请求正文&#xff0c;这一行非常重要&…...

    2024/4/21 17:03:13

最新文章

  1. form1弹出子窗体form2,拖动子窗体判断是否离开父窗体区域,含源码(学习笔记)

    一、效果&#xff08;进入和离开&#xff09; 子窗体到达父窗体边缘时变色。 二、代码分析 判断父窗体的目的&#xff0c;可以控制子窗体要随父窗体走。上面代码需要加以处理。 如&#xff1a;this.Location new Point(parentPoint.X distanceFromEdge, this.Location.Ydis…...

    2024/4/30 21:59:36
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. ROS2高效学习第十章 -- ros2 高级组件之大型项目中的 launch 其二

    ros2 高级组件之大型项目中的 launch 1 前言和资料2 正文2.1 启动 turtlesim&#xff0c;生成一个 turtle &#xff0c;设置背景色2.2 使用 event handler 重写上节的样例2.3 turtle_tf_mimic_rviz_launch 样例 3 总结 1 前言和资料 早在ROS2高效学习第四章 – ros2 topic 编程…...

    2024/4/30 3:28:16
  4. ASTM C1186-22 纤维水泥平板

    以无石棉类无机矿物纤维、有机合成纤维或纤维素纤维&#xff0c;单独或混合作为增强材料&#xff0c;以普通硅酸盐水泥或水泥中添加硅质、钙质材料代替部分水泥为胶凝材料&#xff0c;经制浆、成型、蒸汽或高压蒸汽养护制成的板材&#xff0c;俗称水泥压力板。 ASTM C1186-22纤…...

    2024/4/24 20:02:42
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57