1. 线程概念

1. 并发的发展历程
  • 早期的计算机穿孔打卡
    同一时刻只能运行一个程序,程序输入过程中,计算机处于空闲状态
  • 晶体管和批处理系统:
    a: 程序员把卡片拿到 1401 机 b: 1401 机把批处理作业读到磁带上
    c: 操作员把输入磁带送到熬 7094 机 d: 7094 机进行计算
    e: 操作员把输出磁带送到 1401 机 f:1401 机打印输出
    在这里插入图片描述
    缺点:某一个作业因为等待磁盘或其他IO操作而暂停时,CPU只能阻塞直到该IO完成,IO操作多的场景,CPU资源浪费严重
  • 集成电路和多道程序设计——进程的出现
    把内存分为多个部分,每个部分放不同的程序。当一个程序需要等待I/O 操作完成时, CPU 可以切换执行内存中的另外一个程序。如果内存中可以同时存放足够多的程序,那 CPU的利用率可以接近 100%
    在这个时候,引入了第一个概念- 进程, 进程的本质是一个正在执行的程序,程序运行时系统会创建一个进程,并且给每个进程分配独立的内存地址空间保证每个进程地址不会相互干扰。同时,在 CPU 对进程做时间片的切换时,保证进程切换过程中仍然要从进程切换之前运行的位置出开始执行。所以进程通常还会包括程序计数器、堆栈指针。
  • 线程
    线程是操作系统执行程序的最小操作单元,一个进程可以创建多个线程。
  1. 单线程中,多线程本质是通过切换CPU时间片切换给不同的线程去执行,在多核 CPU 中,利用多线程可以实现真正意义上的并行执行
  2. 在一个应用进程中,会存在多个同时执行的任务,如果其中一个任务被阻塞,将会引起不依赖该任务的任务也被阻塞。通过对不同任务创建不同的线程去处理,可以提升程序处理的实时性
  3. 线程可以认为是轻量级的进程,所以线程的创建、销毁比进程更快
2.并发和并行
  • 并发/高并发
    以tomcat为例,它默认的并发数是150,当超过这个值的时候,就会出现一些请求响应变慢,无法获取连接等问题,那么它能够承受的并发数量(单位时间内能够处理的请求的数量)由什么因素决定? 一台服务器能承载的最大并发数量,是由硬件资源和软件层面共同决定的。
    在系统硬件资源(CPU 内存 磁盘 网络)不可改变的情况下,想要提高并发量,在软件层面可以通过以下方面最大化的利用硬件资源来提升

线程数量; >JVM 内存分配大小 ;网络通信机制(NIO BIO AIO),磁盘IO

  • 线程数量如何提升服务端的并发数量
    CPU决定了软件层面能够创建的线程的最大数量。一个CPU同一时刻只能去处理一件事情。
  • 并发和并行的区别
    并发是服务器端能够同时处理的请求的数量,并行是当前CPU能够同时处理的线程的数量;
    单核CPU也可以支持多线程,但是它是通过CPU时间片切换去执行不同的线程的。
    Erlang 之父 Joe Armstrong 用一张5岁小孩都能看懂的图解释了并发与并行的区别:
    在这里插入图片描述
    并发是两个队列交替使用一台咖啡机
    并行是两个队列同时使用两台咖啡机,如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。
    Question: 并发是不是一个线程,并行是多个线程?
    —— 并发和并行都可以是很多个线程,就看这些线程能不能同时被(多个)cpu执行,如果可以就说明是并行,而并发是多个线程被(一个)cpu 轮流切换着执行。
3. 多线程的特点
  • 异步
    异步是相对同步来说。什么是同步? 假设你发微信给别人,然后等待回复,别人未回复之前,你一直等,直到回复了你再继续发
    异步就是微信发完了就不管了,接着做其他事情,比如看个视频等。异步可以理解为不阻塞当前的处理过程,如下图,上面部分是同步执行,下面部分是异步执行,异步执行对于请求的处理时间影响很大:
    在这里插入图片描述
  • 并行
    并行就是同时执行
    在这里插入图片描述

2. Java中的线程

Java中创建线程的方式有:

  • 继承Thread类
package com.example.springbootthreaddemo;public class TestDemo extends Thread{@Overridepublic void run() {//线程会执行的指令try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " Come in");}public static void main(String[] args) {TestDemo testDemo=new TestDemo();testDemo.setName("SubThread");testDemo.start();// 线程异步:这里子线程睡眠2s,主线程会先执行完。如果线程是同步的,那么主线程应该等到子线程执行完才会输出System.out.println("Main end");}
}

结果说明了线程是异步执行的,上面代码中子线程睡眠2s,主线程先执行完。如果线程是同步的,那么主线程应该等到子线程执行完才会输出结果。
在这里插入图片描述

  • 实现Runnable接口
  • 实现Callable接口
    实现Callable接口与实现Runnable接口创建线程的区别是,前者能够得到线程执行的返回值。示例:
package com.example.springbootthreaddemo;
import java.util.concurrent.*;public class CallableDemo implements Callable<String> {@Overridepublic String call() throws Exception {System.out.println("come in");Thread.sleep(1000);System.out.println("Sub thread sleep 1s");Thread.sleep(1000);System.out.println("Sub thread sleep 2s");return "SUCCESS";}public static void main(String[] args) throws ExecutionException, InterruptedException {ExecutorService executorService=Executors.newFixedThreadPool(1);CallableDemo callableDemo=new CallableDemo();Future<String> future=executorService.submit(callableDemo);//阻塞 这里future.get是阻塞的,当call方法没有执行完,future.get()是得不到执行结果的System.out.println("Main thread get result = "+future.get());}
}

在这里插入图片描述
从上面执行结果可以看到,主线程在子线程睡眠结束,返回之后,才能拿到子线程的执行结果,也就是说future.get()是同步阻塞执行的。

多线程实际使用案例:

package com.example.springbootthreaddemo;
import com.example.springbootthreaddemo.persistence.User;
import com.example.springbootthreaddemo.service.IUserService;
import com.example.springbootthreaddemo.service.SmsClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;@RestController
public class UserController {@AutowiredSmsClient smsClient;@AutowiredIUserService userService;ExecutorService executorService= Executors.newFixedThreadPool(10);@PostMapping("/sms/user")public String register(User user){long start=System.currentTimeMillis();userService.insert(user);//异步.  Future ->//会创建N个线程//MQ来代替executorService.submit(new Runnable() {@Overridepublic void run() {smsClient.sendSms("16607691862");}});long end=System.currentTimeMillis();return "SUCCESS:"+(end-start);}
}

在上面代码中,SmsClient是一个真实的短信发送工具类,代码逻辑是,用户注册之后,数据库保存用户信息,然后通过短信网关平台向用户发送一条注册成功的短信。如果不使用多线程来发送短信(代码如下),那么这个接口所消耗的时间就是入库用户信息的时间 加上 调用短信平台发送短信成功返回后所消耗的时间,而使用线程池去发送短信之后,整个接口的消耗时间只有入库用户信息的时间,这就是线程异步执行的意义。

@PostMapping("/sms/user")public String register(User user){long start=System.currentTimeMillis();userService.insert(user);smsClient.sendSms("16607691862");long end=System.currentTimeMillis();return "SUCCESS:"+(end-start);}

总结: 我们可以通过多线程的并行执行和异步化的执行来提升软件处理的性能,从而减小请求在某个处理上的耗时,单个请求处理耗时降低之后,那么CPU就有更多的资源去处理更多的请求,这也是线程异步执行的意义。

3. 多线程基础

3.1 线程的生命周期

线程的启动到结束,有一个过程,每个过程都对应不同的状态。如下示例:

package com.example.springbootthreaddemo.demo02;
import com.mysql.cj.util.TimeUtil;
import java.util.concurrent.TimeUnit;public class Demo {public static void main(String[] args) {new Thread(()->{while(true){try {TimeUnit.SECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}//阻塞状态 : 子线程通过睡眠阻塞的主线程的执行},"STATUS_01").start();  new Thread(()->{while(true){synchronized (Demo.class){try {Demo.class.wait(); } catch (InterruptedException e) {e.printStackTrace();}}}//阻塞状态  调用wait()进行阻塞},"STATUS_02").start(); new Thread(new BlockedDemo(),"BLOCKED-DEMO-01").start();new Thread(new BlockedDemo(),"BLOCKED-DEMO-02").start();}static class BlockedDemo extends  Thread{@Overridepublic void run() {// 加上类锁synchronized (BlockedDemo.class){while(true){try {TimeUnit.SECONDS.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}}
}

上面代码中创建了四个线程。STATUS_01 线程通过睡眠阻塞主线程,STATUS_02 通过调用wait()方法进行阻塞,
后面两个线程BLOCKED-DEMO-01 和BLOCKED-DEMO-02 会进行锁的抢占,抢到锁的线程,睡眠100ms后再进行锁的释放; 如何查看线程状态呢? 在启动代码运行后打开IDEA的terminal终端,输入命令 jps 查看当前进程的PID ,然后使用 jstack PID 去查看这个进程对应的线程的堆栈信息:
在这里插入图片描述

2020-05-17 23:23:57
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):"DestroyJavaVM" #18 prio=5 os_prio=0 tid=0x0000000000ffc000 nid=0x2eec waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"BLOCKED-DEMO-02" #17 prio=5 os_prio=0 tid=0x000000001ba23800 nid=0x29e4 waiting for monitor entry [0x000000001c48f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.example.springbootthreaddemo.demo02.Demo$BlockedDemo.run(Demo.java:46)- waiting to lock <0x00000000d6721898> (a java.lang.Class for com.example.springbootthreaddemo.demo02.Demo$BlockedDemo)at java.lang.Thread.run(Thread.java:748)"BLOCKED-DEMO-01" #15 prio=5 os_prio=0 tid=0x000000001ba22800 nid=0x3d2c waiting on condition [0x000000001c38e000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at java.lang.Thread.sleep(Thread.java:340)at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)at com.example.springbootthreaddemo.demo02.Demo$BlockedDemo.run(Demo.java:46)- locked <0x00000000d6721898> (a java.lang.Class for com.example.springbootthreaddemo.demo02.Demo$BlockedDemo)at java.lang.Thread.run(Thread.java:748)"STATUS_02" #13 prio=5 os_prio=0 tid=0x000000001ba41000 nid=0x272c in Object.wait() [0x000000001c28f000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000d63f8ef0> (a java.lang.Class for com.example.springbootthreaddemo.demo02.Demo)at java.lang.Object.wait(Object.java:502)at com.example.springbootthreaddemo.demo02.Demo.lambda$main$1(Demo.java:28)- locked <0x00000000d63f8ef0> (a java.lang.Class for com.example.springbootthreaddemo.demo02.Demo)at com.example.springbootthreaddemo.demo02.Demo$$Lambda$2/443308702.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)"STATUS_01" #12 prio=5 os_prio=0 tid=0x000000001ba3f000 nid=0x4654 waiting on condition [0x000000001c18f000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at java.lang.Thread.sleep(Thread.java:340)at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)at com.example.springbootthreaddemo.demo02.Demo.lambda$main$0(Demo.java:17)at com.example.springbootthreaddemo.demo02.Demo$$Lambda$1/205797316.run(Unknown Source)at java.lang.Thread.run(Thread.java:748)"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x0000000019ed4000 nid=0x540 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x0000000019ebd000 nid=0x3bd8 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x0000000019eb9000 nid=0x25c4 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x0000000019e85800 nid=0x2e2c waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x0000000019e82800 nid=0x2bec waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x0000000019e7e800 nid=0xe64 runnable [0x000000001b28e000]java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at java.net.SocketInputStream.read(SocketInputStream.java:171)at java.net.SocketInputStream.read(SocketInputStream.java:141)at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)- locked <0x00000000d6453568> (a java.io.InputStreamReader)at java.io.InputStreamReader.read(InputStreamReader.java:184)at java.io.BufferedReader.fill(BufferedReader.java:161)at java.io.BufferedReader.readLine(BufferedReader.java:324)- locked <0x00000000d6453568> (a java.io.InputStreamReader)at java.io.BufferedReader.readLine(BufferedReader.java:389)at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000000019bf8000 nid=0x3e40 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000000019c4a800 nid=0x3704 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x00000000184f2000 nid=0x5ec in Object.wait() [0x000000001af2f000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000d6188ed0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)- locked <0x00000000d6188ed0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000033de000 nid=0x8fc in Object.wait() [0x000000001ae2e000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000d6186bf8> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:502)at java.lang.ref.Reference.tryHandlePending(Reference.java:191)- locked <0x00000000d6186bf8> (a java.lang.ref.Reference$Lock)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)"VM Thread" os_prio=2 tid=0x00000000184e6800 nid=0x3f98 runnable"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000032fb000 nid=0x3994 runnable"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00000000032fc800 nid=0x24fc runnable"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00000000032fe800 nid=0x4740 runnable"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000003300000 nid=0x22fc runnable"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000003303000 nid=0x3f90 runnable"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000003304800 nid=0x3878 runnable"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000000003307800 nid=0x426c runnable"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000000003308800 nid=0x4738 runnable"GC task thread#8 (ParallelGC)" os_prio=0 tid=0x000000000330a000 nid=0x19d4 runnable"GC task thread#9 (ParallelGC)" os_prio=0 tid=0x000000000330b000 nid=0x3af4 runnable"VM Periodic Task Thread" os_prio=2 tid=0x000000001b800000 nid=0x4338 waiting on conditionJNI global references: 317

从上面可以看到SATAUS_01线程的状态是TIMED_WAITING (sleeping)
在这里插入图片描述
STATUS_02 线程的状态是 WAITING (on object monitor) ,两者都叫阻塞

在这里插入图片描述

BLOCKED-DEMO-01 线程的状态是 TIMED_WAITING (sleeping) ,说明它抢到了锁并开始睡眠,BLOCKED-DEMO-02线程的状态是: BLOCKED (on object monitor) ,也是一种阻塞状态,因为BLOCKED-DEMO-02 和BLOCKED-DEMO-01都去抢占锁,但是BLOCKED-DEMO-01已经抢到了锁,BLOCKED-DEMO-02线程获取不到锁,因此是等待状态。

在这里插入图片描述
从上面的例子可以了解到了线程的生命周期,但线程的整个生命周期中并不是固定的处于某个状态,而是随着代
码的执行在不同的状态之间进行切换:
在这里插入图片描述

3.2 线程的启动

 public synchronized void start() {/*** This method is not invoked for the main method thread or "system"* group threads created/set up by the VM. Any new functionality added* to this method in the future may have to also be added to the VM.** A zero status value corresponds to state "NEW".*/if (threadStatus != 0)throw new IllegalThreadStateException();/* Notify the group that this thread is about to be started* so that it can be added to the group's list of threads* and the group's unstarted count can be decremented. */group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}private native void start0();

查看Thread类的start()方法,发现它最终调用了一个本地方法start0() ,是一个在jvm层面的。Java中本质是没有线程的,那么Java代码中的创建一个线程,本质上是JVM 根据不同操作系统去调用对应的OS系统的创建线程的过程,过程如下:java代码中通过new Thread().start()方法启动线程(直接调用Thread的run方法是调用实例方法,非启动一个线程),这个start()方法里面会调用一个C++语言编写的本地方法start0(),
在这里插入图片描述
start0()这个方法是在Thread 的静态块中来注册的:
在这里插入图片描述
registerNatives 的 本 地 方 法 的 定 义 在 文 件Thread.c,Thread.c 定义了各个操作系统平台要用的关于线程的公共数据和操作(Thread.c内容)在这里插入图片描述
从上面可以看到start0() 实 际 会执 行的是JVM_StartThread 方法,这个方法定义在jvm.cpp 文件中(需要下载hotspot源码):
在这里插入图片描述
JVM_ENTRY 是用来定义 JVM_StartThread 函数的,在这个函数里面创建了一个真正和平台有关的本地线程, JavaThread 的定义在 hotspot 的源码中 thread.cpp 文件中 1558 行的位置可以找到如下代码
在这里插入图片描述
这个方法有两个参数,第一个是函数名称,线程创建成功之后会根据这个函数名称调用对应的函数;第二个是当前进程内已经有的线程数量,os::create_thread,实际就是调用平台创建线程的方法来创建线程。接下来就是线程的启动,会调用 Thread.cpp 文件中的
Thread::start(Thread* thread)方法,代码如下
在这里插入图片描述
Thread::start(Thread* thread) 方法中有一个函数调用: os::start_thread(thread),最终调用的是不同的操作系统平台启动线程的方法,最终会调用 Thread.cpp 文件中的 JavaThread::run()方法。

3.3 线程的终止

线程终止的条件:

  • 线程run方法执行结束
  • volatile jint _interrupted; // Thread.isInterrupted state
    线程正常情况下,不需要进行终止,只有一种情 况,线程的run方法中如果存在一个外界无法去终止的操作时,(如while循环,线程睡眠:Thread.sleep(200000)等, 线程睡眠虽然不占用CPU资源,但是线程也阻塞在那里,无法被执行),线程就无法结束,像下面代码中的这样,
public class InterruptDemo implements Runnable{private int i=1;@Overridepublic void run() {while(true){System.out.println("Test:"+i++);}}public static void main(String[] args) {Thread thread=new Thread(new InterruptDemo());thread.start();}
}

这种情况下,要终止线程,可以使用一个外部可以控制的boolean变量来作为while循环的条件,但是实际上并不这么做。java的线程中提功了一个方法Thread.currentThread().isInterrupted() ,它提供了一个共享变量isInterrupted作为中断的标记,默认为false,通过Thread.currentThread().isInterrupted() 可以去判断中断标记的状态:

   public boolean isInterrupted() {return isInterrupted(false);}/*** Tests if some Thread has been interrupted.  The interrupted state* is reset or not based on the value of ClearInterrupted that is* passed.*/private native boolean isInterrupted(boolean ClearInterrupted);

看下面这样一段代码,while循环中检测中断标记的状态值,主线程中通过 thread.interrupt() 来设置中断标记的值为true,使得线程能够被终止:

public class InterruptDemo01 implements Runnable{private int i=1;@Overridepublic void run() {
//        Thread.currentThread().isInterrupted()=false;
//        表示一个中断的标记  interrupted=faslewhile(!Thread.currentThread().isInterrupted()){System.out.println("Test:"+i++);}}public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(new InterruptDemo01());thread.start();Thread.sleep(1);//设置 interrupted=true;thread.interrupt();}
}

运行结果如下,注意看,左边run下面的按钮是绿色,表示程序执行结束了。
在这里插入图片描述
通过改变中断标记来让线程停止运行,也适用于线程阻塞的情况,如下代码:

public class InterruptDemo implements Runnable{private int i=1;@Overridepublic void run() {try {System.out.println("子线程开始睡眠3s");Thread.sleep(3000);System.out.println("子线程睡眠3s结束");} catch (InterruptedException e) {e.printStackTrace();}System.out.println("子线程结束运行");}public static void main(String[] args) throws InterruptedException {Thread thread=new Thread(new InterruptDemo());thread.start();System.out.println("主线程开始睡眠1s");Thread.sleep(1000);System.out.println("主线程睡眠结束");thread.interrupt();System.out.println("主线程设置中断标记为true并结束运行");}
}

执行结果如下:
在这里插入图片描述
上面就是是两个通过线程中断 thread.interrupt() 来终止线程运行的例子;当其他线程通过调用当前线程的 interrupt 方法,表示向当
前线程打个招呼,告诉他可以中断线程的执行了,至于什么时候中断,取决于当前线程自己;
针对线程阻塞的方法,要想去中断线程的执行,那么阻塞的方法必须抛出一个中断异常,表示线程响应了外部对他的中断,也就是说,当外部想要唤醒一个阻塞的线程时,线程只能通过抛出一个异常来表示它对中断的响应(凡是让线程阻塞的机制,都会有抛出一个InterruptedException才能够响应外界对线程的中断)。

  • 线程复位
    ** 对 抛 出InterruptedException 异 常 的 方 法 , 在InterruptedException 抛出之前,JVM 会先把线程的中断标识位清除,然后才抛出 InterruptedException,这个时候如果调用 isInterrupted 方法,将会返回 false**

  • 线程终止原理
    thread.interrupt()方法:
    在这里插入图片描述
    这个方法里面,调用了 interrupt0(),这个方法在前面分析start 方法的时候见过,是一个 native 方法,找到 jvm.cpp 文件,找到JVM_Interrupt 的定义
    在这里插入图片描述
    这个方法直接调用了 Thread.cpp中的Thread::interrupt(thr)这个方法:
    在这里插入图片描述
    Thread::interrupt 方法调用了 os::interrupt 方法,这个是调用平台的 interrupt 方法,这个方法的实现是在 os_*.cpp
    文件中,其中星号代表的是不同平台,因为 jvm 是跨平台的,所以对于不同的操作平台,线程的调度方式都是不一样的,以 os_linux.cpp 文件为例:
    在这里插入图片描述

set_interrupted(true)实际上就是调用 osThread.hpp 中的set_interrupted()方法,在 osThread 中定义了一个成员属
性 volatile jint _interrupted;
通过上面的代码分析可以知道,thread.interrupt()方法实际就是设置一个 interrupted 状态标识为 true、并且通过
ParkEvent 的 unpark 方法来唤醒线程。

  1. 对于 synchronized 阻塞的线程,被唤醒以后会继续尝试获取锁,如果失败仍然可能被 park
  2. 在调用 ParkEvent 的 park 方法之前,会先判断线程的中断状态,如果为 true,会清除当前线程的中断标识
  3. Object.wait 、 Thread.sleep 、 Thread.join 会 抛 出InterruptedException

为什么 Object.wait、Thread.sleep 和 Thread.join 都 会 抛 出InterruptedException?
——这几个方法有一个共同点,都是属于阻塞的方法,而阻塞方法的释放会取决于一些外部的事件,但是阻塞方法可能因为等不到外部的触发事件而导致无法终止,所以它允许一个线程请求自己来停止它正在做的事情。当一个方法抛出 InterruptedException 时,它是在告诉调用者如果执行该方法的线程被中断,它会尝试停止正在做的事情并且通过抛出 InterruptedException 表示提前返回。所以,这个异常的意思是表示一个阻塞被其他线程中断了。然 后 , 由 于 线 程 调 用 了 interrupt() 中 断 方 法 , 那 么Object.wait、Thread.sleep 等被阻塞的线程被唤醒以后会通过 is_interrupted 方法判断中断标识的状态变化,如果发现中断标识为 true,则先清除中断标识,然后抛出InterruptedException,需要注意的是,InterruptedException 异常的抛出并不意味着线程必须终止,而是提醒当前线程有中断的操作发生,
至于接下来怎么处理取决于线程本身,比如

  1. 直接捕获异常不做任何处理
  2. 将异常往外抛出
  3. 停止当前线程,并打印异常信息
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 2020.4.19笔记——RocketMQ应用②

    延迟消费 在生产者可以设置消息的延迟级别(并不能设定一个具体的值),当然这种延迟只是消费者的延迟,消息其实已经发送给了消费者。这种延迟级别代表的延迟时间我们可以再控制台中看到具体的数值,上面设置的级别为3就是延迟10秒。批量发送 发送一次消息,一次发送多条消息,…...

    2024/4/26 1:42:44
  2. 2020.4.21笔记——RocketMQ应用③

    Group组 在RocketMQ中存在组的概念,有生产者组,也有消费者者,而每一个生产者或者消费者都是某个组的成员之一。而且对于组来说RocketMQ中的消息可以将它们看成一个个体。 生产者组 生产者组的特殊性在于处理分布式事务时,当生产者组内有生产者无法提供事务回调,就会由组内…...

    2024/4/15 8:16:43
  3. XCOPY爱高贝bb2zabbix监控安装及实现对tomcat服务器监控

    一.zabbix监控安装配置实现对本机的监控 监控端ip 192.168.1.11 被监控端ip 192.168.1.12 1.zabbix相关包的安装 1)zabbix的仓库源配置 root@ubuntu1804:~# wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-2+bionic_all.deb …...

    2024/4/23 14:56:49
  4. 2020年电工(初级)证模拟考试题库及电工(初级)理论考试试题

    题库来源:安全生产模拟考试一点通公众号小程序2020年电工(初级)证模拟考试题库及电工(初级)理论考试试题是由公众号安全生产模拟考试一点通提供,电工(初级)证模拟考试题库是根据电工(初级)最新版教材,电工(初级)大纲整理而成(含2020年电工(初级)证模拟考试题库…...

    2024/5/3 1:22:07
  5. zabbix实现对mysql数据库主从监控XCOPY爱高贝bb2

    1.主从关系建立 配置mysql-master端: 1)修改mysql-master的配置文件 [root@localhost ~]# vim /etc/my.cnf [mysqld] server_id=1 innodb_file_per_table datadir=/data/mysql socket=/var/lib/mysql/mysql.sock log-bin=/data/log-bin/bin binlog_format=row …… 2)启动my…...

    2024/4/23 14:56:52
  6. JavaEE——MD5加密

    目录了解MD5加密MD5加密的使用 了解MD5加密 MD5即Message-Digest Algorithm 5(信息-摘要算法5),MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以百防止被篡改。MD5是不可逆加度密,也就是说问没有破解的方法,或者说破解的方法只能靠穷举法答! 1、…...

    2024/4/23 14:56:44
  7. Consul 注册中心介绍

    转自:https://blog.csdn.net/qwe86314/article/details/95094751在 Spring Cloud 体系中,几乎每个角色都会有两个以上的产品提供选择,比如在注册中心有:Eureka、Consul、zookeeper、etcd 等;网关的产品有 Zuul、Spring Cloud Gateway 等。在注册中心产品中,最常使用的是 E…...

    2024/4/22 19:49:10
  8. Python 飞机大战代码练习

    Python 飞机大战代码练习 最近在自学Python,参照代码自己写了一遍飞机大战游戏的代码。主要应用的模块为pygame。整个代码如下所示,主要分为主模块和各种精灵类定义模块,记录一下自己的学习历程。 下面展示一些 全部代码内容。 // 主模块 import pygame from plane_sprite i…...

    2024/4/23 14:56:42
  9. XCOPY爱高贝bb2gitlab的部署、代码克隆和提交、数据备份等

    股指期货原油期货期货交易黄金期货期货开户1.配置网卡及ubuntu仓库源 1)配置网卡eth0,本地内网网卡无需指定网关和域名服务器 network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no addresses: [192.168.1.30/24] 2)配置网卡eth1,要保持以下两个字节的严格缩…...

    2024/4/23 14:56:40
  10. Android 记录开发中的一些问题

    1 XRecyclerView 在设置适配器时,能够保持显示数据大小一致@NonNull@Overridepublic Holder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {View view = LayoutInflater.from(context).inflate(R.layout.adapter_main, viewGroup,false);return new Holder(view…...

    2024/4/23 14:56:46
  11. 截取url的参数工具类

    public static Map<String,String> getParm(String url){String[] urlParts = url.split("\\?");//有参数String[] params = urlParts[1].split("&");HashMap hashMap = new HashMap<>();for (String param : params) {String[] keyValue…...

    2024/4/30 11:21:01
  12. 7、信息隐藏技术:频域下的信息隐藏

    ...

    2024/4/23 14:56:37
  13. eclipse 英文字母大小写转换快捷键

    转换成大写字母: ctrl+shift+x转换成小写字母: ctrl+shift+y...

    2024/5/3 3:43:07
  14. 华三交换机和思科交换机对接—生成树问题

    1、STP协议-厂商支持情况 H3C交换机支持的生成树协议类型 H3C交换机支持的生成树协议有三种类型,分别是STP(IEEE 802.1D)、RSTP(IEEE 802.1W)和MSTP(IEEE 802.1S),这三种类型的生成树协议均按照标准协议的规定实现,采用标准的生成树协议报文格式,大多数交换机采用固定…...

    2024/4/23 14:56:35
  15. Milvus数据管理:删除的实现原理

    本文将主要讲述 Milvus 是怎么实现删除功能的。删除是许多用户期待已久的功能,这次终于在 Milvus 0.7.0 版本中发布。区别于直接调用 FAISS 的 remove_ids 接口,为了让删除更加高效,并能够支持更多索引类型,我们做了全新的设计。在 FAISS 中,删除 ID 和它对应的向量需要遍…...

    2024/4/17 5:18:36
  16. 推荐系统评估标准

    评估标准准确度召回率覆盖率多样性...

    2024/4/20 13:31:07
  17. PTA-练习3-8 查询水果价格

    原题导航 题目描述:给定四种水果,分别是苹果(apple)、梨(pear)、桔子(orange)、葡萄(grape),单价分别对应为3.00元/公斤、2.50元/公斤、4.10元/公斤、10.20元/公斤。 首先在屏幕上显示以下菜单: [1] apple [2] pear [3] orange [4] grape [0] exit用户可以输入编号1…...

    2024/4/17 5:17:48
  18. Python实现字符串(str)与列表(list)的相互转换

    1. str转list # (1) list函数将字符串中每个字符转化为列表中的一个元素 str1 = Hello! list1 = list(str1) print(list1)# (2) split方法按指定字符块分隔原字符串,被分隔部分作为列表元素 str2 = Hello, 2020! list2 = list(str2.split(, )) print(list2)输出 [H, e, l, l, …...

    2024/4/17 5:17:42
  19. Qt解决资源文件中无法显示图片的问题

    血的教训,在你添加完资源文件以后,一定要先 菜单栏->构建->qmake一下,否则是无法显示的。浪费好长时间找问题。。。。 void MainWindow::paintEvent(QPaintEvent *event) {QPainter painter(this);QPixmap pixmap;pixmap.load(":/image/sky.jpg");painter.d…...

    2024/5/3 7:18:09
  20. 8、信息隐藏技术:数字水印技术

    ...

    2024/4/17 5:17:54

最新文章

  1. 深入Django:用户认证与权限控制实战指南

    title: 深入Django&#xff1a;用户认证与权限控制实战指南 date: 2024/5/7 18:50:33 updated: 2024/5/7 18:50:33 categories: 后端开发 tags: AuthDecoratorsPermissionsGuardianRESTAuthSessionMgmtMFA 第1章&#xff1a;入门Django与设置 1.1 Django安装与环境配置 在…...

    2024/5/8 0:56:45
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现

    导语 今天继续康奈尔大学FPGA课程ECE 5760的典型案例分享——基于DE1-SOC的String Art实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 项目说明 String Art起源于19世纪的数学…...

    2024/5/2 15:32:36
  4. JRT高效率开发

    得益于前期的基础投入&#xff0c;借助代码生成的加持&#xff0c;本来计划用一周实现质控物维护界面&#xff0c;实际用来四小时左右完成质控物维护主体&#xff0c;效率大大超过预期。 JRT从设计之初就是为了证明Spring打包模式不适合软件服务模式&#xff0c;觉得Spring打包…...

    2024/5/7 4:57:38
  5. __dirname 在ES模块中的使用

    前言 ECMAScript模块是 JavaScript 的新标准格式。在Node.js中越来越多的库逐渐从从CommonJS转移到ES模块 注&#xff1a;这里是指“真”ES 模块并不是指代码中 Node.js 中使用 import 写法但是实际被 tsc 转成 commonJS 的形式 但是Node.js ES 开发中此前有一个棘手的问题是获…...

    2024/5/7 13:42:25
  6. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/7 5:50:09
  7. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/7 9:45:25
  8. 【外汇周评】靓丽非农不及疲软通胀影响

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

    2024/5/4 23:54:56
  9. 【原油贵金属早评】库存继续增加,油价收跌

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

    2024/5/7 14:25:14
  10. 【外汇早评】日本央行会议纪要不改日元强势

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

    2024/5/4 23:54:56
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

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

    2024/5/4 23:55:05
  12. 【外汇早评】美欲与伊朗重谈协议

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

    2024/5/4 23:54:56
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

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

    2024/5/7 11:36:39
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/6 1:40:42
  16. 【外汇早评】美伊僵持,风险情绪继续升温

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

    2024/5/4 23:54:56
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

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

    2024/5/4 23:55:17
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/7 9:26:26
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/4 23:55:06
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/5/5 8:13:33
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/5/4 23:55:16
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/5/4 23:54:58
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/6 21:42:42
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/5/4 23:54:56
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

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

    2022/11/19 21:17:18
  27. 错误使用 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
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,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
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2022/11/19 21:16:58
  45. 如何在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