文章目录

  • 一、基础知识
    • 1 并发编程的优缺点
        • 1.1 为什么要使用并发编程(并发编程的优点)
        • 1.2 并发编程有什么缺点
    • 2 并发编程三要素是什么?出现线程安全问题的原因是什么?如何保证多线程的运行安全?
        • 2.1 并发编程三要素(线程的安全性问题体现在)
        • 2.2 出现线程安全问题的原因:
        • 2.3 如何保证多线程的运行安全?
    • 3 并行和并发有什么区别?
    • 4 什么是多线程,多线程的优劣?
        • 4.1 什么是多线程?
        • 4.2 多线程的好处:
        • 4.3 多线程的劣势:
  • 二、 线程和进程区别
    • 1 什么是线程和进程?
    • 2 进程与线程的区别
    • 3 什么是上下文切换?
    • 4 守护线程和用户线程有什么区别呢?
        • 4.1 守护线程和用户线程
        • 4.2 注意事项:
    • 5 如何在 Windows 和 Linux 上查找哪个线程cpu利用率最高?
    • 6 线程死锁
        • 6.1 什么是线程死锁?
        • 6.2 形成死锁的四个必要条件是什么
        • 6.3 如何避免线程死锁
  • 三、线程的创建
        • 1 创建线程有哪几种方式?
        • 1.1 继承 Thread 类
        • 1.2 实现 Runnable 接口
        • 1.3 实现 Callable 接口
        • 1.4 使用 Executors 工具类创建线程池
    • 2 说一下 runnable 和 callable 有什么区别?
        • 2.1 相同点
        • 2.2 主要区别
    • 3 线程的 run()和 start()有什么区别?为什么调用 start() 方法时会执行 run() 方法,而不直接调用 run() 方法?
        • 3.1 线程的 run()和 start()有什么区别?
        • 3.2 为什么调用 start() 方法时会执行 run() 方法,而不直接调用 run() 方法?
    • 4 什么是 Callable 和 Future?
    • 5 什么是 FutureTask
  • 四、线程的状态和基本操作
    • 1 说说线程的生命周期及五种基本状态?
    • 2 Java 中用到的线程调度算法是什么?
    • 3 线程的调度策略
    • 4 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?
    • 5 请说出与线程同步以及线程调度相关的方法。
    • 6 sleep() 和 wait() 有什么区别?
    • 7 你是如何调用 wait() 方法的?使用 if 块还是循环?为什么?
    • 8 为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?
    • 9 为什么 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?
    • 10 Thread 类中的 yield 方法有什么作用?
    • 11 为什么 Thread 类的 sleep()和 yield ()方法是静态的?
    • 12 线程的 sleep()方法和 yield()方法有什么区别?
    • 13 如何停止一个正在运行的线程?
    • 14 Java 中 interrupted 和 isInterrupted 方法的区别?
    • 15 什么是阻塞式方法?
    • 16 Java 中你怎样唤醒一个阻塞的线程?
    • 17 notify() 和 notifyAll() 有什么区别?
    • 18 如何在两个线程间共享数据?
    • 19 Java 如何实现多线程之间的通讯和协作?
    • 20 Java中线程通信协作的最常见的两种方式:
    • 21 同步方法和同步块,哪个是更好的选择?
    • 22 什么是线程同步和线程互斥,有哪几种实现方式?
        • 22.1 什么是线程同步和线程互斥
        • 22.2 实现线程同步的方法
    • 23 什么叫线程安全?servlet 是线程安全吗?
    • 24 在 Java 程序中怎么保证多线程的运行安全?
    • 25 你对线程优先级的理解是什么?
    • 26 线程类的构造方法、静态块是被哪个线程调用的
    • 27 一个线程运行时发生异常会怎样?

一、基础知识

1 并发编程的优缺点

1.1 为什么要使用并发编程(并发编程的优点)

  1. 充分利用多核CPU的计算能力
  2. 方便进行业务拆分
  3. 在百万级千万级的并发量要求下,多线程并发编程是开发高并发系统的基础,
  4. 面对复杂业务模型,并行程序会比串行程序更符合业务需求

1.2 并发编程有什么缺点

并发编程并不总是能提高程序运行速度的,可能也会遇到很多问题,比如:内存泄漏、上下文切换、线程安全、死锁等问题。

2 并发编程三要素是什么?出现线程安全问题的原因是什么?如何保证多线程的运行安全?

2.1 并发编程三要素(线程的安全性问题体现在)

  1. 原子性:原子,即一个不可再被分割的颗粒。原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。
  2. 可见性:一个线程对共享变量的修改,另一个线程能够立刻看到。(synchronized,volatile)
  3. 有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)

2.2 出现线程安全问题的原因:

  1. 线程切换带来的原子性问题
  2. 缓存导致的可见性问题
  3. 编译优化带来的有序性问题

2.3 如何保证多线程的运行安全?

  1. JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题
  2. synchronized、volatile、LOCK,可以解决可见性问题
  3. Happens-Before规则、as-if-serial规则和内存屏障 解决有序性问题

3 并行和并发有什么区别?

并发:多个任务在同一个 CPU 核上,按细分的时间片轮流(交替)执行,从逻辑上来看那些任务是同时执行。
并行:单位时间内,多个处理器或多核处理器同时处理多个任务,是真正意义上的“同时进行”。
串行:有n个任务,由一个线程按顺序执行。由于任务、方法都在一个线程执行所以不存在线程不安全情况,也就不存在临界区的问题。

4 什么是多线程,多线程的优劣?

4.1 什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务。

4.2 多线程的好处:

  1. 提高多核CPU 的利用率。
  2. 在多线程程序中,一个线程在运行的时候,另一个线程不必处于等待状态,可以在另一个cup上运行,大大提高了程序的效率。

4.3 多线程的劣势:

  1. 线程也是程序,线程需要占用内存,线程越多占用内存也越多;
  2. 多线程需要协调和管理,所以需要 CPU 时间跟踪线程;
  3. 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题。

二、 线程和进程区别

1 什么是线程和进程?

进程

一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。

线程

进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

2 进程与线程的区别

根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

执行过程:每个独立的进程有程序运行的入口、顺序执行序列和程序出口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,两者均可并发执行

3 什么是上下文切换?

多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。

4 守护线程和用户线程有什么区别呢?

4.1 守护线程和用户线程

用户 (User) 线程:运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程等都是用户线程

守护 (Daemon) 线程:运行在后台,为其他前台线程服务。也可以说守护线程是 JVM 中非守护线程的 “佣人”。一旦所有用户线程都结束运行,守护线程会随 JVM 一起结束工作
main 函数所在的线程就是一个用户线程啊,main 函数启动的同时在 JVM 内部同时还启动了好多守护线程,比如垃圾回收线程。

比较明显的区别之一是用户线程结束,JVM 退出,不管这个时候有没有守护线程运行。而守护线程不会影响 JVM 的退出。

4.2 注意事项:

  1. setDaemon(true)必须在start()方法前执行,否则会抛出 IllegalThreadStateException 异常
    在守护线程中产生的新线程也是守护线程
  2. 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑
  3. 守护 (Daemon) 线程中不能依靠 finally 块的内容来确保执行关闭或清理资源的逻辑。因为我们上面也说过了一旦所有用户线程都结束运行,守护线程会随 JVM 一起结束工作,所以守护 (Daemon) 线程中的 finally 语句块可能无法被执行。

5 如何在 Windows 和 Linux 上查找哪个线程cpu利用率最高?

windows上面用任务管理器看,linux下可以用 top 这个工具看。

  1. 找出cpu耗用厉害的进程pid, 终端执行top命令,然后按下shift+p 查找出cpu利用最厉害的pid号
    根据上面第一步拿到的pid号,top -H -p pid 。然后按下shift+p,查找出cpu利用率最厉害的线程号,比如top -H -p 1328
  2. 将获取到的线程号转换成16进制
  3. 使用jstack工具将进程信息打印输出,jstack pid号 > /tmp/t.dat,比如jstack 31365 > /tmp/t.dat
  4. 编辑/tmp/t.dat文件,查找线程号对应的信息

6 线程死锁

6.1 什么是线程死锁?

死锁是指两个或两个以上的线程抢占同一资源,并请求锁定对方资源,造成恶性循环的现象,且无外力情况下无法执行下去的情况叫做死锁。

6.2 形成死锁的四个必要条件是什么

互斥条件

线程对于已分配到的资源具有排它性,即一个资源只能被一个线程占用,直到该线程释放

请求与保持条件

一个线程因请求被占用资源而发生阻塞后,对已获得的资源保持不放。

不剥夺条件

线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。

循环等待条件

当发生死锁时,所等待的线程必定会形成一个环路,造成永久阻塞

6.3 如何避免线程死锁

只要破坏产生死锁的四个条件中的其中一个就可以了。

破坏互斥条件

这个条件我们没有办法破坏,因为我们用锁本来就是想让他们互斥的(临界资源需要互斥访问)。

破坏请求与保持条件

一次性申请所有的资源。

破坏不剥夺条件

占用部分资源的线程进一步申请其他资源时,如果申请不到,可以主动释放它占有的资源。

破坏循环等待条件

靠按序申请资源来预防。按某一顺序申请资源,释放资源则反序释放。破坏循环等待条件。

三、线程的创建

1 创建线程有哪几种方式?

  1. 继承 Thread 类;
  2. 实现 Runnable 接口;
  3. 实现 Callable 接口;
  4. 使用 Executors 工具类创建线程池

1.1 继承 Thread 类

  1. 定义一个Thread类的子类,重写run方法,将相关逻辑实现,run()方法就是线程要执行的业务逻辑方法
  2. 创建自定义的线程子类对象
  3. 调用子类实例的start()方法来启动线程
public class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " run()方法正在执行...");}}
public class TheadTest {public static void main(String[] args) {MyThread myThread = new MyThread(); 	myThread.start();System.out.println(Thread.currentThread().getName() + " main()方法执行结束");}}

执行结果

main main()方法执行完成
Thread-0 run()方法执行中...

1.2 实现 Runnable 接口

  1. 定义Runnable接口实现类MyRunnable,并重写run()方法
  2. 创建MyRunnable实例myRunnable,以myRunnable作为target创建Thead对象,该Thread对象才是真正的线程对象
  3. 调用线程对象的start()方法
 public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " run()方法执行中...");}}public class RunnableTest {public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread = new Thread(myRunnable);thread.start();System.out.println(Thread.currentThread().getName() + " main()方法执行完成");}}

执行结果

main main()方法执行完成
Thread-0 run()方法执行中...

1.3 实现 Callable 接口

  1. 创建实现Callable接口的类myCallable
  2. 以myCallable为参数创建FutureTask对象
  3. 将FutureTask作为参数创建Thread对象
  4. 调用线程对象的start()方法
public class MyCallable implements Callable<Integer> {@Overridepublic Integer call() {System.out.println(Thread.currentThread().getName() + " call()方法执行中...");return 1;}}public class CallableTest {public static void main(String[] args) {FutureTask<Integer> futureTask = new FutureTask<Integer>(new MyCallable());Thread thread = new Thread(futureTask);thread.start();try {Thread.sleep(1000);System.out.println("返回结果 " + futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " main()方法执行完成");}}

执行结果

Thread-0 call()方法执行中...
返回结果 1
main main()方法执行完成

1.4 使用 Executors 工具类创建线程池

Executors提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
主要有newFixedThreadPool,newCachedThreadPool,newSingleThreadExecutor,newScheduledThreadPool,后续详细介绍这四种线程池

public class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " run()方法执行中...");}}public class SingleThreadExecutorTest {public static void main(String[] args) {ExecutorService executorService = Executors.newSingleThreadExecutor();MyRunnable runnableTest = new MyRunnable();for (int i = 0; i < 5; i++) {executorService.execute(runnableTest);}System.out.println("线程任务开始执行");executorService.shutdown();}}

执行结果

线程任务开始执行
pool-1-thread-1 is running...
pool-1-thread-1 is running...
pool-1-thread-1 is running...
pool-1-thread-1 is running...
pool-1-thread-1 is running...

2 说一下 runnable 和 callable 有什么区别?

2.1 相同点

  1. 都是接口
  2. 都可以编写多线程程序
  3. 都采用Thread.start()启动线程

2.2 主要区别

Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息
注:Callalbe接口支持返回执行结果,需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞。

3 线程的 run()和 start()有什么区别?为什么调用 start() 方法时会执行 run() 方法,而不直接调用 run() 方法?

3.1 线程的 run()和 start()有什么区别?

  1. 关系:start()方法是由Thread类所定义的,Thread类实现了Runable接口,并重写了run()方法。run()方法是由Runnable接口定义的。
  2. 执行方式:start()方法在一个线程中只能执行一次来开启线程使线程进入就绪状态,等待被CPU调用。而run()方法是执行线程中的任务,是从就绪状态获得CPU使用权并分配到一定的CPU时间片后进入运行时状态。

3.2 为什么调用 start() 方法时会执行 run() 方法,而不直接调用 run() 方法?

单独调用run方法属于实现Runnable接口的实现类的函数调用,不属于线程范围,而调用start()方法后则开启一个线程,将线程处于就绪状态等待被CPU所调用,当run()方法的自动执行就是该线程从就绪状态进入运行时状态,获得CPU使用权并分配到一定的CPU时间执行线程体,是真正意义上的线程运行。

4 什么是 Callable 和 Future?

Callable 接口是创建线程的方式之一,通过实现Calable接口可以重写call()方法,并且call()方法带有具有泛型特性的返回值,Future是可以拿到该返回值的异步任务。所以说 Callable用于产生结果,Future 用于获取结果。

5 什么是 FutureTask

FutureTask 表示一个异步运算的任务。FutureTask 里面可以传入一个 Callable 的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。只有当运算完成的时候结果才能取回,如果运算尚未完成 get 方法将会阻塞。一个 FutureTask 对象可以对调用了 Callable 和 Runnable 的对象进行包装,由于 FutureTask 也是Runnable 接口的实现类,所以 FutureTask 也可以放入线程池中。

四、线程的状态和基本操作

1 说说线程的生命周期及五种基本状态?

在这里插入图片描述

新建(new):新创建了一个线程对象。

可运行(runnable):线程对象创建后,当调用线程对象的 start()方法,该线程处于就绪状态,等待被线程调度器选中,以获得cpu的使用权。

运行(running):可运行状态(runnable)的线程获得了CPU的使用权,分配到了一定的CPU时间片(timeslice),执行线程体。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞(block):处于运行状态中的线程由于某种原因,暂时放弃对 CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被 CPU 调用以进入到运行状态。

阻塞的情况分三种:
(一). 等待阻塞:运行状态中的线程执行 wait()方法,JVM会把该线程放入等待队列(waitting queue)中,使本线程进入到等待阻塞状态;
(二). 同步阻塞:线程获取 synchronized 的同步锁失败(因为锁被其它线程所占用),,则JVM会把该线程放入锁池(lock pool)中,线程会进入同步阻塞状态;
(三). 其他阻塞: 通过调用线程的 sleep()或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。当 sleep()状态超时、join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。

死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

2 Java 中用到的线程调度算法是什么?

Java虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中的线程优先级相同,那么就随机选择一个线程,使其占用CPU。处于运行状态的线程会一直运行,直至它不得不放弃 CPU。
线程调度是由操作系统内核决定的,常见的会有协同式和抢占式
不同操作系统线程调度算法不同,Java虚拟机是基于抢占式算法进行设计的(不是实现了抢占式算法),给不同线程可以赋予不同的优先级,但是最终线程调度是由操作系统内核来进行的,优先级是否生效以及存在几个优先级级别都是不一定的,所以Java虚拟机设置的线程优先级是不可靠的,可能级别无法一一对应(Java10种,windows7种),或者系统内核是使用了其他调度算法并不完全或者不按照优先级进行调度。Java对于优先级的设定只是一种对系统内核的“建议”,最终如何调度还是由系统内核完成的。而对于不同操作和不同的系统设置都有不同的调度策略。
比如对于Windows系统,很老的版本(3.x以前)使用协同式调度,线程执行时间由自己控制,线程需要在执行完后主动通知别的线程让出cpu。现在常见的windows版本多是抢占式调度,但是也可能配合“优先级推进器”,当一个线程工作特别繁忙,就可能越过优先级获得执行时间的分配。
对于Linux系统,主要有三种线程调度策略:SCHED_OTHER分时调度,SCHED_FIFO实时调度先到先服务,SCHED_RR实时调度时间片轮转。 分时调度下,所有线程优先级都是0,按照线程等待队列中顺序分时运行,但是注意着各种调度策略的线程是可以被其他高优先级策略的线程抢占执行的。 实时调度先到先服务策略下线程优先级必须大于0,当高优先级的线程结束或者阻塞线程得以执行,直到更高优先级线程来到或者自身执行完前,将一直运行,相同或者低优先级线程需要等待,可能导致其他线程一直无法执行。 实时调度时间片轮转是对SCHED_FIFO的一种优化,限定了线程任务执行的最大时间片,当某个任务运行用完了时间片会被放到相同优先级任务队列的最后,相同优先级的其他任务得以执行。

3 线程的调度策略

线程调度器选择抢占式调度模型,采用优先级最高的线程运行,

但是,如果发生以下情况,就会终止线程的运行:

(1)线程体中调用了 yield() 方法让出了对 cpu 的使用权
(2)线程体中调用了 sleep() 方法使线程进入“睡眠状态“”,从运行时状态转变为阻塞状态。
(3)线程由于 IO 操作受到阻塞
(4)有比运行时状态执行线程更高优先级的线程出现
(5)在支持时间片的系统中,该线程的时间片用完

4 什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing )?

线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。一旦我们创建一个线程,该线程进入就绪状态等待线程调度器为其分配CPU时间后进入运行状态。

时间分片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU 时间可以基于线程优先级或者线程等待的时间。

5 请说出与线程同步以及线程调度相关的方法。

(1) wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理 InterruptedException 异常;

(3)notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且与优先级无关;

(4)notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

6 sleep() 和 wait() 有什么区别?

相同:
两个方法都作用于运行时状态区,都可以使线程让出对CPU的使用权并暂停线程的执行

类的不同:
sleep() 是 Thread线程类的静态方法,wait() 是 Object类的方法。

是否释放锁:
sleep() 不释放所持有的对象的锁;wait() 释放所持有的对象的锁。

用途不同:
wait() 通常被用于线程间交互/通信,sleep() 通常被用于暂停执行。

用法不同:
wait() 方法被调用后,线程在等待队列中,不会自动苏醒,需要其他线程调用同一个对象上的 notify() 或者 notifyAll() 方法。sleep() 方法执行完成后,线程会自动苏醒。或者可以使用wait(long timeout)超时后线程会自动苏醒。

7 你是如何调用 wait() 方法的?使用 if 块还是循环?为什么?

处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。

wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:

synchronized (monitor) {//  判断条件谓词是否得到满足while(!locked) {//  等待唤醒monitor.wait();}//  处理其他的业务逻辑
}

8 为什么线程通信的方法 wait(), notify()和 notifyAll()被定义在 Object 类里?

java设计的决定。wait和notify不是常见的普通java方法或同步工具,在java中它们更多的是实现两个线程之间的通信机制,用来通知线程的阻塞与唤醒。通信机制由共享资源来实现,即将wait、notify、notifyAll方法定义在Object中是最合理的,线程需要获得锁并等待锁可用,它们并不知道也不需要知道哪些线程持有锁,它们只需要知道当前资源是否被占用,是否可以获得锁。

9 为什么 wait(), notify()和 notifyAll()必须在同步方法或者同步块中被调用?

当A线程持有该对象的锁,则调用wait()方法释放该对象的锁,此时A线程进入等待状态,直到B线程持有该对象的锁并调用notify()或者notifyAll()唤醒该线程(notify()和notifyAll()唤醒线程并不是指定唤醒,而是由JVM虚拟机自行控制,具体可参考notify()和notifyAll()的具体概念)。由于执行的方法都需要线程持有对象的锁,这样就只能通过同步来实现,所以他们只能在同步方法或者同步块中被调用。

10 Thread 类中的 yield 方法有什么作用?

使当前线程从运行状态变为可运行状态(就绪状态)。

11 为什么 Thread 类的 sleep()和 yield ()方法是静态的?

Thread 类的 sleep()和 yield()方法将在当前正在执行的线程上运行。所以在其他处于等待状态的线程上调用这些方法是没有意义的。这就是为什么这些方法是静态的。它们可以在当前正在执行的线程中工作,并避免程序员错误的认为可以在其他非运行线程调用这些方法。

12 线程的 sleep()方法和 yield()方法有什么区别?

(1) sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会;yield()方法只会给相同优先级或更高优先级的线程以运行的机会;

(2) 线程执行 sleep()方法后转入阻塞(blocked)状态,而执行 yield()方法后转入就绪(ready)状态;

(3)sleep()方法声明抛出 InterruptedException,而 yield()方法没有声明任何异常;

(4)sleep()方法比 yield()方法(跟操作系统 CPU 调度相关)具有更好的可移植性,通常不建议使用yield()方法来控制并发线程的执行。

13 如何停止一个正在运行的线程?

在java中有以下3种方法可以终止正在运行的线程:

  1. 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
  2. 使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。
  3. 使用interrupt方法中断线程。

14 Java 中 interrupted 和 isInterrupted 方法的区别?

interrupt:用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。

注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException 的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。

interrupted:是静态方法,查看当前中断信号是true还是false并且清除中断信号。如果一个线程被中断了,第一次调用 interrupted 则返回 true,第二次和后面的就返回 false 了。

isInterrupted:查看当前中断信号是true还是false

15 什么是阻塞式方法?

阻塞式方法是指程序会一直等待该方法完成期间不做其他事情,ServerSocket 的accept()方法就是一直等待客户端连接。这里的阻塞是指调用结果返回之前,当前线程会被挂起,直到得到结果之后才会返回。此外,还有异步和非阻塞式方法在任务完成前就返回。

16 Java 中你怎样唤醒一个阻塞的线程?

首先 ,wait()、notify() 方法是针对对象的,调用任意对象的 wait()方法都将导致线程阻塞,阻塞的同时也将释放该对象的锁,相应地,调用任意对象的 notify()方法则将随机解除该对象阻塞的线程,但它需要重新获取该对象的锁,直到获取成功才能往下执行;

其次,wait、notify 方法必须在 synchronized 块或方法中被调用,并且要保证同步块或方法的锁对象与调用 wait、notify 方法的对象是同一个,如此一来在调用 wait 之前当前线程就已经成功获取某对象的锁,执行 wait 阻塞后当前线程就将之前获取的对象锁释放。

17 notify() 和 notifyAll() 有什么区别?

如果线程调用了对象的 wait()方法,那么线程便会处于该对象的等待池中,等待池中的线程不会去竞争该对象的锁。

notifyAll() 会唤醒所有的线程,notify() 只会唤醒一个线程。

notifyAll() 调用后,会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行,如果不成功则留在锁池等待锁被释放后再次参与竞争。而 notify()只会唤醒一个线程,具体唤醒哪一个线程由虚拟机控制。

18 如何在两个线程间共享数据?

在两个线程间共享变量即可实现共享。

一般来说,共享变量要求变量本身是线程安全的,然后在线程内使用的时候,如果有对共享变量的复合操作,那么也得保证复合操作的线程安全性。

19 Java 如何实现多线程之间的通讯和协作?

可以通过中断 和 共享变量的方式实现线程间的通讯和协作

比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。因此,一般情况下,当队列满时,会让生产者交出对临界资源的占用权,并进入挂起状态。然后等待消费者消费了商品,然后消费者通知生产者队列有空间了。同样地,当队列空时,消费者也必须等待,等待生产者通知它队列中有商品了。这种互相通信的过程就是线程间的协作。

20 Java中线程通信协作的最常见的两种方式:

一.syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()

二.ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll()

线程间直接的数据交换:

三.通过管道进行线程间通信:1)字节流;2)字符流

21 同步方法和同步块,哪个是更好的选择?

同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。

同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象,这样从侧面来说也可以避免死锁。

请知道一条原则:同步的范围越小越好。

22 什么是线程同步和线程互斥,有哪几种实现方式?

22.1 什么是线程同步和线程互斥

当一个线程对共享的数据进行操作时,应使之成为一个”原子操作“,即在没有完成相关操作之前,不允许其他线程打断它,否则,就会破坏数据的完整性,必然会得到错误的处理结果,这就是线程的同步。

在多线程应用中,考虑不同线程之间的数据同步和防止死锁。当两个或多个线程之间同时等待对方释放资源的时候就会形成线程之间的死锁。为了防止死锁的发生,需要通过同步来实现线程安全。

线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。

用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。

22.2 实现线程同步的方法

同步代码方法:sychronized 关键字修饰的方法

同步代码块:sychronized 关键字修饰的代码块

使用特殊变量域volatile实现线程同步:volatile关键字为域变量的访问提供了一种免锁机制

使用重入锁实现线程同步:reentrantlock类是可冲入、互斥、实现了lock接口的锁他与sychronized方法具有相同的基本行为和语义

在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
在 java 虚拟机中,每个对象( Object 和 class )通过某种逻辑关联监视器,每个监视器和一个对象引用相关联,为了实现监视器的互斥功能,每个对象都关联着一把锁。

一旦方法或者代码块被 synchronized 修饰,那么这个部分就放入了监视器的监视区域,确保一次只能有一个线程执行该部分的代码,线程在获取锁之前不允许执行该部分的代码

另外 java 还提供了显式监视器( Lock )和隐式监视器( synchronized )两种锁方案

如果你提交任务时,线程池队列已满,这时会发生什么
这里区分一下:

(1)如果使用的是无界队列 LinkedBlockingQueue,也就是无界队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为 LinkedBlockingQueue 可以近乎认为是一个无穷大的队列,可以无限存放任务

(2)如果使用的是有界队列比如 ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue 中,ArrayBlockingQueue 满了,会根据maximumPoolSize 的值增加线程数量,如果增加了线程数量还是处理不过来,ArrayBlockingQueue 继续满,那么则会使用拒绝策略RejectedExecutionHandler 处理满了的任务,默认是 AbortPolicy

23 什么叫线程安全?servlet 是线程安全吗?

线程安全是编程中的术语,指某个方法在多线程环境中被调用时,能够正确地处理多个线程之间的共享变量,使程序功能正确完成。

Servlet 不是线程安全的,servlet 是单实例多线程的,当多个线程同时访问同一个方法,是不能保证共享变量的线程安全性的。

Struts2 的 action 是多实例多线程的,是线程安全的,每个请求过来都会 new 一个新的 action 分配给这个请求,请求完成后销毁。

SpringMVC 的 Controller 是线程安全的吗?不是的,和 Servlet 类似的处理流程。

Struts2 好处是不用考虑线程安全问题;Servlet 和 SpringMVC 需要考虑线程安全问题,但是性能可以提升不用处理太多的 gc,可以使用 ThreadLocal 来处理多线程的问题。

24 在 Java 程序中怎么保证多线程的运行安全?

方法一:使用安全类,比如 java.util.concurrent 下的类,使用原子类AtomicInteger
方法二:使用自动锁 synchronized。
方法三:使用手动锁 Lock。
手动锁 Java 示例代码如下:

Lock lock = new ReentrantLock();
lock. lock();
try {System. out. println("获得锁");
} catch (Exception e) {// TODO: handle exception
} finally {System. out. println("释放锁");lock. unlock();
}

25 你对线程优先级的理解是什么?

每一个线程都是有优先级的,一般来说,高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现,这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级,但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先级是一个 int 变量(从 1-10),1 代表最低优先级,10 代表最高优先级。

Java 的线程优先级调度会委托给操作系统去处理,所以与具体的操作系统优先级有关,如非特别需要,一般无需设置线程优先级。

26 线程类的构造方法、静态块是被哪个线程调用的

这是一个非常刁钻和狡猾的问题。请记住:线程类的构造方法、静态块是被 new这个线程类所在的线程所调用的,而 run 方法里面的代码才是被线程自身所调用的。

如果说上面的说法让你感到困惑,那么我举个例子,假设 Thread2 中 new 了Thread1,main 函数中 new 了 Thread2,那么:

(1)Thread2 的构造方法、静态块是 main 线程调用的,Thread2 的 run()方法是Thread2 自己调用的

(2)Thread1 的构造方法、静态块是 Thread2 调用的,Thread1 的 run()方法是Thread1 自己调用的

Java 中怎么获取一份线程 dump 文件?你如何在 Java 中获取线程堆栈?
Dump文件是进程的内存镜像。可以把程序的执行状态通过调试器保存到dump文件中。

在 Linux 下,你可以通过命令 kill -3 PID (Java 进程的进程 ID)来获取 Java应用的 dump 文件。

在 Windows 下,你可以按下 Ctrl + Break 来获取。这样 JVM 就会将线程的 dump 文件打印到标准输出或错误文件中,它可能打印在控制台或者日志文件中,具体位置依赖应用的配置。

27 一个线程运行时发生异常会怎样?

如果异常没有被捕获该线程将会停止执行。Thread.UncaughtExceptionHandler是用于处理未捕获异常造成线程突然中断情况的一个内嵌接口。当一个未捕获异常将造成线程中断的时候,JVM 会使用 Thread.getUncaughtExceptionHandler()来查询线程的 UncaughtExceptionHandler 并将线程和异常作为参数传递给 handler 的 uncaughtException()方法进行处理。

Java 线程数过多会造成什么异常?
线程的生命周期开销非常高

消耗过多的 CPU

资源如果可运行的线程数量多于可用处理器的数量,那么有线程将会被闲置。大量空闲的线程会占用许多内存,给垃圾回收器带来压力,而且大量的线程在竞争 CPU资源时还将产生其他性能的开销。

降低稳定性JVM

在可创建线程的数量上存在一个限制,这个限制值将随着平台的不同而不同,并且承受着多个因素制约,包括 JVM 的启动参数、Thread 构造函数中请求栈的大小,以及底层操作系统对线程的限制等。如果破坏了这些限制,那么可能抛出OutOfMemoryError 异常。
————————————————

版权声明:本文为CSDN博主「ThinkWon」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ThinkWon/article/details/104863992

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

相关文章

  1. 项管:范围管理

    里程碑&#xff1a;在每个分解单元中都存在可交付的成果和里程碑。里程碑标志着某个可交付成果或者阶段的正式完成。里程碑和可交付成果紧密联系在一起&#xff0c;但并不是一个事物。可交付成果可能包括报告、原型、成果和最终产品。而里程碑则关注于是否完成。 工作包&#…...

    2024/4/1 18:52:30
  2. TypeError: Scalar value for argument ‘color‘ is not numeric

    使用openCV生成验证码时 cv2.putText出现TypeError: Scalar value for argument ‘color’ is not numeric 这句话的意思是颜色参数不是不是数字类型 引发该错误的情况有两种 1、color值超出&#xff08;0&#xff0c;255&#xff09; 2、坐标值错误&#xff0c;输入坐标为[…...

    2024/5/6 21:13:05
  3. 多线程 第六节 ThreadLocal

    ThreadLocal 1、 ThreadLocal线程局部变量。 JDK 提供的 ThreadLocal 使每一个线程都有自己的局部变量。 2、 ThreadLocal 为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每一个线程都可以独立地改变自己的副本&#xff0c;而不会影响其它线程所对应的副本。…...

    2024/5/4 20:44:54
  4. 国内Mac安装brew方法(简单高效)

    在安装brew之前&#xff0c;要先安装xcode&#xff0c;并同意Xcode license agreements。 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"...

    2024/5/7 3:07:19
  5. 第1、2单元 linux 命令行使用技巧linux 下的文件管理

    ##1.什么是linux### linux 是指Linux内核 内核 ##系统的核心程序 ##相当于人的大脑 #负责系统程序和硬件分配及调度 ##2.什么是shell## shell ##对外提供操作和系统沟通接口 ##对内实现对内核进行保护 ##RHEL8中默认使用的shell是bash ##3.s…...

    2024/4/28 14:36:41
  6. c语言文件之文件打开方式

    c语言文件之文件打开方式 打开文件参数1&#xff1a;文件的路经&#xff08;相对于可执行文件的相对路径或绝对路径参数2&#xff1a;文件的模式 r 读模式 w 写模式 a 追加模式 读写模式 b 二进制模式文件存在 各种模式都可以用 文件不存在 读模式下会返回错误 写模式或追…...

    2024/4/1 18:52:22
  7. Hadoop案例(六)小文件处理(自定义InputFormat)

    小文件处理&#xff08;自定义InputFormat&#xff09; 1.需求分析 无论hdfs还是mapreduce&#xff0c;对于小文件都有损效率&#xff0c;实践中&#xff0c;又难免面临处理大量小文件的场景&#xff0c;此时&#xff0c;就需要有相应解决方案。将多个小文件合并成一个文件Sequ…...

    2024/4/17 7:34:25
  8. python tolist()方法

    将数组或者矩阵转换成列表&#xff0c;如下&#xff1a; >>> from numpy import * >>> a1 [[1,2,3],[4,5,6]] #列表 >>> a2 array(a1) #数组 >>> a2 array([[1, 2, 3],[4, 5, 6]]) >>> a3 mat(a1) #矩阵 >>> a3 mat…...

    2024/4/1 11:23:55
  9. Scrapy+request 抓取瓜子二手车网站数据

    首先用分析下目标站点&#xff0c;目标url为&#xff1a;https://www.guazi.com/www/buy&#xff0c;中www代表全国&#xff0c;如果点击选择深圳会调到站点为深圳的界面。所以只要选择全国可以获取全国各个站点的数据。 接着复制request headers 到文本编辑器 去掉cookies, …...

    2024/4/1 11:23:54
  10. 都有哪些途径解决平时的bug

    1、面向百度编程 2、前往https://stackoverflow.com/ 这网站上面有很多知识都被搬运了 3、去各大博客网站 4、上面都不行就找一找谷歌 这个需要科学工具&#xff0c;有它可以访问一切网站了&#xff0c;有些服务器在国外的网站也可以链接的很快。...

    2024/4/26 9:37:07
  11. Python四大容器

    Python四大容器 1.列表&#xff08;list) 列表是最常见的一种数据形式&#xff0c;它可以把大量数据放在一起&#xff0c;可以对其进行集中处理&#xff0c;不仅可以方便地进行数据处理&#xff0c;还可以减少声明很多变量。 列表是以”[]”包围的数据集合&#xff0c;不同成…...

    2024/4/17 13:22:17
  12. Linux系统简介与安装

    贝尔实验室工程师&#xff0c;开发unix系统&#xff0c;之后向美国大学开放&#xff0c;芬兰大学学生李纳斯开发了Linux开源软件。 Linux系统标志企鹅&#xff0c;一种说法企鹅是芬兰的吉祥物。一种南极和北极不属于任何一个国家&#xff0c;Linux也是不作为商业用途。 Linux内…...

    2024/4/23 14:53:09
  13. Flink的数据持久化-CheckPoint机制

    Flink内存易失&#xff0c;利用CheckPoint机制数据持久化&#xff0c;偏于出现异常&#xff0c;应用挂掉时&#xff0c;做数据恢复。所谓CheckPoint&#xff08;可以理解为CheckPoint是把State数据持久化存储了&#xff09;则表示了一个FlinkJob在一个特定时刻的一份全局状态快…...

    2024/5/1 22:15:43
  14. JS,jQuery加载后执行

    1.加载后执行存在的意义 我们都知道页面的代码顺序是从上往下进行加载&#xff0c;很多时候我们要对页面中的某一个模块进行操作&#xff0c;这时候我们常常使用javascript代码来进行操作。为了能够保证操作的模块或对象在js代码之前就加载了&#xff0c;我们不得不把js代码放…...

    2024/4/28 7:40:31
  15. Hadoop案例(七)MapReduce中多表合并

    MapReduce中多表合并案例 一.案例需求 订单数据表t_order&#xff1a; id pid amount 1001 01 1 1002 02 2 1003 03 3 订单数据order.txt 1001 01 1 1002 02 2 1003 03 3 1004 01 4 1005 02 5 1006 03 6 商品信息表t_produc…...

    2024/4/27 20:30:44
  16. 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 1010 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 3030 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。 现在

    #include<stdio.h> int main() { int a[10]; for(int i1;i<10;i) scanf("%d",&a[i]); int h; scanf("%d",&h); int ans0; for(int i1;i<10;i) { if(h30>a[i]) ans; } printf("%d",ans); return 0; }...

    2024/5/4 10:17:50
  17. Playing games

    题目&#xff1a; https://ac.nowcoder.com/acm/contest/295/H 有n个数&#xff0c;选出尽量多的数使得异或和为000。 1≤n≤500000,0≤ai≤5000001\le n\le 500000,0\le a_i\le 5000001≤n≤500000,0≤ai​≤500000 思路&#xff1a; 问题等价于选出尽量少的数使得异或和为全…...

    2024/4/1 18:52:20
  18. 学习笔记 详解一种高效位反转算法

    详解一种高效位反转算法位反转算法原理32位数的高效位反转算法实现8位数的高效位反转算法实现位反转 这里的位反转(Bit Reversal)&#xff0c;指的是一个数的所有bit位依照中点对换位置&#xff0c;例如0b0101 0111 > 0b1110 1010。也可以叫二进制逆序&#xff0c;按位逆序…...

    2024/4/23 20:16:31
  19. 阿里云到底是干什么的

    阿里云你可能没有听过&#xff0c;但支付宝&#xff0c;淘宝这些应用软件你肯定听过&#xff0c;阿里云与它们一样&#xff0c;都是阿里巴巴集团的子公司&#xff0c;下面我们来介绍介绍阿里云 阿里云(全称:阿里云计算有限公司)是一家云计算及人工智能科技公司&#xff0c;致力…...

    2024/5/2 13:48:27
  20. String类中的equals方法与Object类中的equals方法的不同点

    1.首先我们看看Object类中的equals方法 public boolean equals(Object obj) {return (this obj);}我们可以看出Object类中判断的是否是同一个对象&#xff0c;我们接下来来看看下面这个例子 Employee emp1 new Employee("张三", 5000, 2005, 5 ,5); Employee emp…...

    2024/4/29 7:46:54

最新文章

  1. SSM框架目录

    ssm 知识相关目录主要参考尚硅谷 赵伟风老师的视屏&#xff0c;参考链接为 SSM视频_ SSM技术视频_SSM视频教程_尚硅谷 【注意】有些图片为了简便&#xff0c;所以就直接使用了视屏分析。 1、SSM框架相关知识 SpringFramework 基本概念 链接&#xff1a;SpringFramework 基本…...

    2024/5/7 6:24:15
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/6 9:38:23
  3. 巨控科技新品发布:全方位升级,引领智能控制新纪元

    标签: #巨控科技 #智能控制 #新品发布 #GRM560 #OPC560 #NET400 在智能控制领域&#xff0c;巨控科技始终以其前沿技术和创新产品引领着市场的潮流。近日&#xff0c;巨控科技再次以其行业领先的研发实力&#xff0c;推出了三大系列的新产品&#xff0c;旨在为各行各业提供更…...

    2024/5/5 9:14:44
  4. Android 开发投屏软件

    一、背景 作为Android开发总会有给他人share自己APP情况&#xff0c;一般在线会议投屏&#xff0c;总是需要在手机上安装对应会议软件特别麻烦~ 二、投屏 Android Studio已经自带了投屏能力&#xff0c;可以在电脑端直接控制手机&#xff0c;同步起来非常方便简单 打开步骤 …...

    2024/5/6 15:53:13
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/6 18:23:10
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/6 18:40:38
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/6 23:37:19
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/6 7:24:07
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/7 0:32:52
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/6 6:01:13
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/6 7:24:06
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/7 1:54:46
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/6 20:04:22
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/7 0:32:51
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/6 7:24:04
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/6 7:24:04
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/6 19:38:16
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/6 7:24:03
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/7 0:32:49
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/6 21:25:34
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/6 7:24:02
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/6 7:24:01
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/7 0:32:47
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/6 16:50:57
  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