线程知识点总结
Java线程是Java并发编程中的核心概念之一,它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结:
1. 线程的创建与启动
-
继承Thread类:创建一个新的类继承
Thread
类,并重写其run()
方法。通过创建该类的实例并调用start()
方法来启动线程。 -
实现Runnable接口:创建一个类实现
Runnable
接口,并实现run()
方法。然后将该类的实例作为参数传递给Thread
类的构造器,之后通过Thread对象调用start()
方法。 -
使用Executor框架(推荐):从Java 5开始引入,提供了一个更强大的线程管理机制,如
Executors
类可以创建固定大小的线程池、单线程执行器等,提高了线程复用和管理的效率。
在Java中,线程的创建和启动主要通过以下方式实现:
1. 继承Thread类
步骤如下:
- 定义一个新类继承自
Thread
类。 - 在新类中重写
Thread
类的run()
方法。在这个方法里定义需要并行执行的代码逻辑。 - 创建新类的实例。
- 调用实例的
start()
方法来启动线程。注意,不要直接调用run()
方法,因为那样会把run()
当作普通方法在当前线程中执行,而不是启动新线程。
示例代码;
class MyThread extends Thread {public void run() {System.out.println("通过继承Thread类创建线程");}
}public class Main {public static void main(String[] args) {MyThread t = new MyThread();t.start(); // 启动线程}
}
2. 实现Runnable接口
步骤如下:
- 定义一个类实现
Runnable
接口。 - 实现
Runnable
接口中的run()
方法,放入线程需要执行的代码。 - 创建实现了
Runnable
接口的类的实例。 - 创建
Thread
类的实例,并将实现了Runnable
接口的类的实例作为参数传递给Thread
的构造函数。 - 调用
Thread
实例的start()
方法来启动线程。
示例代码:
class MyRunnable implements Runnable {public void run() {System.out.println("通过实现Runnable接口创建线程");}
}public class Main {public static void main(String[] args) {MyRunnable r = new MyRunnable();Thread t = new Thread(r);t.start(); // 启动线程}
}
3使用Executor框架(推荐)
从Java 5开始,还可以使用Executor
框架来管理和控制线程,比如使用Executors
类创建线程池,这种方式更加灵活且易于管理线程生命周期和资源。
示例代码:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {public static void main(String[] args) {ExecutorService executor = Executors.newSingleThreadExecutor();executor.execute(() -> {System.out.println("通过Executor框架创建线程");});executor.shutdown(); // 关闭线程池}
}
这三种方式中,使用Runnable
接口和Executor框架更为灵活和推荐,因为它们提供了更好的解耦和线程池管理能力。
2. 线程状态
Java线程有以下几种状态:
Java线程在其生命周期中会经历多种状态,这些状态根据Java线程API定义,主要包括以下几种:
-
新建(New): 线程刚被创建,尚未启动。当通过
new
关键字创建一个Thread
对象时,线程处于此状态。 -
可运行(Runnable): 线程可以被JVM调度执行。这个状态可以细分为两个子状态:
(1)就绪(Ready): 线程已经具备运行条件,正在等待CPU分配时间片以便执行。 (2)运行中(Running): 线程获得CPU时间片,正在执行线程的run()
方法。 -
阻塞(Blocked): 线程因为某种原因(如等待锁、I/O操作等)而暂停执行,此时线程不会被分配CPU时间片,直到导致阻塞的原因解除。
-
等待(Waiting): 线程因为调用了
Object.wait()
、Thread.join()
或者LockSupport.park()
等方法而进入等待状态。这种状态下,线程必须等待其他线程执行特定动作(如通知notify()
或notifyAll()
)才能继续执行。 -
超时等待(Timed Waiting): 与等待状态相似,但是有一个明确的等待时间限制,例如通过
Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
等方法设置了等待时间。超过这个时间后,线程会自动恢复到可运行状态,无需其他线程显式唤醒。 -
终止(Terminated): 线程执行完毕或因异常结束,线程生命周期结束。
3. 线程同步
为了防止多线程环境下的数据不一致问题,Java提供了以下同步机制:
- synchronized关键字:用于方法或代码块,保证同一时刻只有一个线程可以访问被synchronized保护的代码或方法。
- Lock接口(java.util.concurrent.locks):比synchronized更灵活,提供了更多的锁操作,如公平锁、非公平锁、可重入锁等。
- volatile关键字:用于变量,确保了多线程之间的可见性,但不保证原子性。
Java线程同步是为了避免多线程环境下对共享资源的不正确访问而导致的数据不一致性问题。Java提供了多种线程同步机制来保障线程安全,主要包含以下几种:
1. synchronized关键字
- 方法同步:在方法声明上使用
synchronized
关键字,这样一次只能有一个线程访问该方法。
public synchronized void synchronizedMethod() {// 方法体
}
- 代码块同步:可以在特定的代码块上使用
synchronized
,指定一个对象作为锁。
public void synchronizedBlockMethod() {synchronized(this) {// 需要同步的代码块}
}
2. Lock接口
java.util.concurrent.locks.Lock
接口提供了比synchronized
更灵活的锁定机制,它允许尝试非阻塞地获取锁、能够被中断地等待锁以及超时获取锁等特性。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class X {private final Lock lock = new ReentrantLock();public void method() {lock.lock();try {// 需要同步的代码} finally {lock.unlock();}}
}
3. volatile关键字
虽然volatile
不是一种同步机制,但它能保证变量的可见性和部分有序性,适用于状态标记量的读写操作。
private volatile boolean flag = false;public void setFlag(boolean newValue) {flag = newValue;
}public boolean getFlag() {return flag;
}
4. 原子类(Atomic)
Java提供了java.util.concurrent.atomic
包下的原子类,如AtomicInteger
、AtomicBoolean
等,它们通过CAS(Compare and Swap,比较并交换)操作实现线程安全的更新操作。
import java.util.concurrent.atomic.AtomicInteger;public class Counter {private AtomicInteger count = new AtomicInteger(0);public void increment() {count.incrementAndGet();}public int getCount() {return count.get();}
}
5. Condition接口
Condition
接口(在Lock
接口的实现类中提供)用于更复杂的线程间协调,它是对传统Object
类中的wait()
、notify()
和notifyAll()
方法的改进版本,可以和Lock一起使用,实现更细粒度的线程同步。
总结
选择合适的线程同步机制取决于具体的应用场景。对于简单的同步需求,synchronized
关键字往往是首选;对于更复杂的并发控制,Lock
和Condition
提供了更高的灵活性;而对于基本类型的原子操作,原子类提供了简单且高效的解决方案。正确应用这些同步机制,可以有效地避免竞态条件,保证程序的线程安全。
4. 线程间通信
- wait()、notify()、notifyAll():这些方法定义在
Object
类中,用于线程间的等待/通知机制,必须在同步上下文中使用。 - Condition接口(java.util.concurrent.locks):作为Lock接口的一部分,提供了更灵活的线程间协调行为,可以替代传统的wait/notify。
Java中线程间的通信主要是指一个线程向另一个线程发送信号,或者多个线程之间互相协作完成任务的能力。Java提供了多种机制来支持线程间的通信,以下是一些常用的方法:
1. wait(), notify(), notifyAll()
这三个方法都是在Object
类中定义的,常用于线程间的同步和通信。它们必须在同步代码块或同步方法中使用。
- wait():使当前线程等待,并释放对象的监视器锁。等待直到其他线程调用该对象的
notify()
或notifyAll()
方法。 - notify():唤醒在此对象监视器上等待的单个线程,选择是任意的,并且在Java中不可预测。
- notifyAll():唤醒在此对象监视器上等待的所有线程。
2. Condition接口
java.util.concurrent.locks.Condition
接口提供了类似wait()
、notify()
、notifyAll()
的功能,但功能更强大,它可以和Lock
配合使用,实现更灵活的线程间协调行为。
await()
:类似wait()
,使当前线程等待,并释放锁。signal()
:唤醒一个等待的线程,类似notify()
。signalAll()
:唤醒所有等待的线程,类似notifyAll()
。
3. CountDownLatch
java.util.concurrent.CountDownLatch
是一个同步辅助类,它允许一个或多个线程等待其他线程完成一系列操作后再继续执行。
CountDownLatch latch = new CountDownLatch(n);
// n个线程完成任务后调用latch.countDown();
latch.await(); // 其他线程在此等待,直到计数器为0
4. CyclicBarrier
java.util.concurrent.CyclicBarrier
也是同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点后再一起继续执行。
CyclicBarrier barrier = new CyclicBarrier(parties);
// 线程执行到barrier点时调用await()
barrier.await();
5. Semaphore
java.util.concurrent.Semaphore
是一个计数信号量,可以控制同时访问特定资源的线程数量。
Semaphore semaphore = new Semaphore(permits);
semaphore.acquire(); // 获取许可
// 执行代码
semaphore.release(); // 释放许可
6. Exchanger
java.util.concurrent.Exchanger
用于在线程间进行数据交换,两个线程通过exchange()方法交换数据,只有双方都准备好时才会发生交换。
Exchanger<String> exchanger = new Exchanger<>();
// 线程A
String dataA = "From A";
String received = exchanger.exchange(dataA); // 等待与B交换数据
// 线程B
String dataB = "From B";
received = exchanger.exchange(dataB); // 等待与A交换数据
正确使用这些线程间通信机制,可以有效地帮助开发人员解决多线程环境下的同步和协作问题。
5. 线程池
- Executor框架:提供了一组线程池相关的类,如
ThreadPoolExecutor
、ScheduledThreadPoolExecutor
等,用于管理和控制线程的创建、执行和销毁,提高性能和资源利用率。
Java线程池是Java并发编程中的一个重要概念,它是一种基于池化概念管理线程的技术,可以重复使用预先创建的线程,以减少线程创建和销毁的开销,提高响应速度和整体性能。Java通过java.util.concurrent.Executor
框架来支持线程池的创建和管理,其中最常用的接口和类包括:
1. Executor接口
这是最顶层的执行者接口,它定义了一个execute(Runnable command)
方法来执行给定的任务。
2. ExecutorService接口
扩展了Executor
接口,提供了更丰富的管理任务和线程池的方法,如提交Callable
任务、关闭线程池等。
3. ThreadPoolExecutor类
实现了ExecutorService
接口,是最常见的线程池实现类,提供了高度可配置的线程池实现。
4. ScheduledExecutorService接口
扩展了ExecutorService
接口,支持计划执行任务,即定时或周期性任务。
5. ScheduledThreadPoolExecutor类
实现了ScheduledExecutorService
接口,用于支持定时及周期性任务的线程池。
6. Executors工厂类
提供了一系列静态方法来创建不同类型的线程池,包括:
- newFixedThreadPool(int nThreads): 创建一个固定大小的线程池,可重用固定数量的线程,适合执行大量短期异步任务。
- newSingleThreadExecutor(): 创建一个只有一个线程的线程池,确保所有的任务按照顺序执行。
- newCachedThreadPool(): 创建一个可缓存线程池,如果线程池长度超过处理所需,可灵活回收空闲线程,若无可回收,则新建线程。
- newScheduledThreadPool(int corePoolSize): 创建一个固定核心线程数的线程池,支持定时及周期性任务执行。
- newWorkStealingPool(int parallelism): (Java 8引入)创建一个拥有多个任务队列的线程池,使用工作窃取算法来充分利用CPU资源。
使用示例
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolExample {public static void main(String[] args) {// 创建一个固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(5);for (int i = 0; i < 10; i++) {Runnable worker = new WorkerThread("" + i);executor.execute(worker); // 提交任务到线程池执行}// 关闭线程池,不再接受新的任务,已提交的任务会执行完executor.shutdown();while (!executor.isTerminated()) {}System.out.println("所有任务已完成");}
}class WorkerThread implements Runnable {private String command;public WorkerThread(String s) {this.command = s;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + " 开始. 命令 = " + command);processCommand();System.out.println(Thread.currentThread().getName() + " 结束.");}private void processCommand() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}
}
合理使用线程池可以有效地管理线程生命周期、提高系统资源的使用效率,以及提升系统的响应速度和吞吐量。但同时也需要注意,不当的配置和使用可能会导致资源耗尽、死锁等问题,因此需要仔细设计和监控线程池的使用情况。
6. 并发工具类
Java并发包(java.util.concurrent)还提供了许多实用的并发工具类,如:
CountDownLatch
:允许一个或多个线程等待其他线程完成一系列操作。CyclicBarrier
:让一组线程等待所有线程到达某个屏障后再一起执行后续操作。Semaphore
:控制同时访问特定资源的线程数量。Future
和Callable
:用于异步计算,可以获取线程执行的结果。
Java并发编程库(java.util.concurrent
包及其子包)提供了丰富的工具类来帮助开发者高效、安全地处理并发问题。以下是一些常用的并发工具类:
1. CountDownLatch
java.util.concurrent.CountDownLatch
是一个同步辅助类,允许一个或多个线程等待其他线程完成一系列操作。初始化时设置一个计数器,每当一个任务完成就递减计数器,计数器为0时,所有等待的线程被释放。
2. CyclicBarrier
java.util.concurrent.CyclicBarrier
也是一种同步辅助类,它允许一组线程相互等待,直到达到一个共同的屏障点,然后所有线程一起继续执行。与CountDownLatch
不同的是,它可以在重置后重复使用。
3. Semaphore
java.util.concurrent.Semaphore
是一个计数信号量,可以用来控制同时访问特定资源的线程数量,或者控制同时执行的任务数量。
4. Exchanger
java.util.concurrent.Exchanger
用于两个线程之间交换对象,当两个线程都到达同步点并且准备好交换时,Exchanger会交换这两个线程的对象。
5. Phaser
java.util.concurrent.Phaser
是一个可重用的同步栏栅,它支持注册多个 parties,并在每个阶段(phase)等待所有 parties 到达屏障点。
6. ConcurrentCollections
Java并发包提供了线程安全的集合类,如ConcurrentHashMap
、CopyOnWriteArrayList
、ConcurrentSkipListMap
等,这些集合类在高并发环境下表现更好。
7. Locks
ReentrantLock
: 可重入互斥锁,提供比synchronized
更灵活的锁定机制,如公平锁、非公平锁、尝试获取锁等。ReentrantReadWriteLock
: 支持读写分离的锁,允许多个读线程同时访问,但只允许一个写线程或一个读线程和一个写线程同时访问。
8. Executors
java.util.concurrent.Executors
工厂类提供了创建不同类型线程池的方法,如newFixedThreadPool
、newSingleThreadExecutor
、newCachedThreadPool
等。
9. Future & Callable
Future
: 代表异步计算的结果,提供了检查计算是否完成、获取结果、取消计算等方法。Callable
: 类似于Runnable
,但可以返回结果,并且可以抛出异常,通常与FutureTask
和线程池一起使用。
10. ForkJoinPool 和 RecursiveTask / RecursiveAction
Fork/Join框架,用于并行处理大数据集,通过将大任务拆分成小任务并行处理。RecursiveTask
用于有返回值的任务,RecursiveAction
用于没有返回值的任务。
这些工具类覆盖了并发编程中的大多数场景,合理运用它们可以大大提高并发程序的性能和可靠性。
7. 死锁与避免
死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉,它们都将无法推进下去。避免死锁的方法包括:
- 避免一个线程同时获取多个锁。
- 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源。
- 尝试使用定时锁,使用lock的tryLock方法代替内部锁机制。
- 按顺序加锁,确保所有线程按照相同的顺序请求锁。
在Java中,死锁是指两个或多个线程互相等待对方持有的锁,从而导致所有线程都无法继续执行的情况。
四个必要条件:
- 互斥条件:资源不能被多个线程同时占有,至少有一个资源必须是独占的。
- 请求与保持条件:已经持有至少一个资源的线程尝试获取额外的资源。
- 不可抢占条件:已分配给线程的资源在该线程释放前不能被其他线程抢占。
- 循环等待条件:存在一种线程资源的循环等待链,每个线程都持有下一个线程所需的资源,并等待先前线程释放资源。
避免死锁:
- 避免嵌套锁:尽量减少在一个线程中同时获取多个锁的需求。如果必须获取多个锁,确保所有线程以相同的顺序获取锁。
- 使用超时锁:使用
tryLock(long time, TimeUnit unit)
方法尝试获取锁,如果在指定时间内无法获取到锁,则放弃并处理相应的逻辑,而不是无限等待。 - 锁顺序:总是按照固定的顺序获取锁,这样可以避免循环等待的条件,例如定义全局的锁顺序或者使用锁的自然顺序(如锁对象的hashcode排序)。
- 锁分解:将大范围的锁分解为多个小范围的锁,减少锁的竞争。
- 使用并发工具类:利用
java.util.concurrent
包提供的高级并发工具,如Semaphore
,CountDownLatch
,CyclicBarrier
,Exchanger
等,这些工具设计时已经考虑了线程安全和死锁问题。 - 按需加锁:尽量减少锁的使用,只有在真正需要同步资源时才加锁,不必要的锁会导致不必要的阻塞和潜在的死锁风险。
- 检测与恢复:虽然Java标准库本身不直接提供死锁检测工具,但在复杂系统中可以设计监控和诊断机制,定期检查线程状态,一旦检测到死锁,可以采取重启线程或事务等恢复措施。
通过上述策略,可以大大降低程序中死锁发生的概率,提高系统的稳定性和响应性。
掌握以上知识点有助于深入理解Java线程机制,并在实际开发中有效利用多线程提升程序性能。
相关文章:
线程知识点总结
Java线程是Java并发编程中的核心概念之一,它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结: 1. 线程的创建与启动 继承Thread类:创建一个新的类继承Thread类,并重写其run()方法。通过创建该类的实例并调用st…...
计算机网络:数据链路层 - 扩展的以太网
计算机网络:数据链路层 - 扩展的以太网 集线器交换机自学习算法单点故障 集线器 这是以前常见的总线型以太网,他最初使用粗铜轴电缆作为传输媒体,后来演进到使用价格相对便宜的细铜轴电缆。 后来,以太网发展出来了一种使用大规模…...
视频修复工具,模糊视频变清晰!
老旧视频画面效果差,视频效果模糊。我们经常找不到一个好的工具来让视频更清晰,并把它变成高清画质。相信很多网友都会有这个需求,尤其是视频剪辑行业的网友,经常会遇到这个问题。今天给大家分享一个可以把模糊视频修复清晰的工具…...
协程库——面试问题
1 同步、异步 1.1 同步 代码顺序执行,完全由用户控制. 同步阻塞 等待可读、可写的时候阻塞,不让出cpu。读、写之后,下面的代码才能执行、 同步非阻塞 等待可读、可写时,不会阻塞cpu,返回失败,设置错误码为…...
数据结构与算法题目集(中文)6-2顺序表操作集
题目地址 https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId725&page0 注意审题,返回false的时候不要返回ERROR,否则答案错误,机器规则是死的。 位置一般指数组下标,位序一般指数组下标1。但是思…...
8086 汇编笔记(十二):int 指令 端口 直接定址表
一、int 指令 int 指令的格式为:int n,n 为中断类型码,它的功能是引发中断过程 CPU 执行 intn 指令,相当于引发一个n号中断的中断过程,执行过程如下: (1) 取中断类型码 n; (2) 标志寄存器入栈,IF0&…...
揭开FFT时域加窗的奥秘
FFT – Spectral Leakage 假设用于ADC输出数据分析的采样点数为N,而采样率为Fs,那我们就知道,这种情况下的FFT频谱分辨率为δf,那么δfFs/N。如果此时我们给ADC输入一个待测量的单频Fin,如果此时Fin除以δf不是整数&a…...
【AI基础】第二步:安装AI运行环境
开局一张图: 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本,上层的版本由下层版本决定 比如CUDA的版本,需要看显卡安装了什么版本的驱动,然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&…...
【MySQL】聊聊唯一索引是如何加锁的
首先我们要明确,加锁的对象是索引,加锁的基本单位是next-key lock,由记录锁和间隙锁组成。next-key是前开后闭区间,间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。 在能使用记录锁或者间隙锁就…...
k8s-CCE使用node节点使用VIP--hostNetworkhostPort
CCE使用node节点使用VIP 背景:想在节点上使用VIP,将nodeport服务做到高可用。启动VIP后发现访问失败 部署 ! Configuration File for keepalived global_defs { router_id master-node }vrrp_instance VI_1 {state BACKUPinterface eth0mcast_src_ip 10.1.0.60virtual_rou…...
18、关于优化中央企业资产评估管理有关事项的通知
一、加强重大资产评估项目管理 (一)中央企业应当对资产评估项目实施分类管理,综合考虑评估目的、评估标的资产规模、评估标的特点等因素,合理确定本集团重大资产评估项目划分标准,原则上,企业对外并购股权项目应纳入重大资产评估项目。中央企业应当研究制定重大资产评估…...
AI大模型日报#0610:港大等1bit大模型“解决AI能源需求”、谷歌开源TimesFM时序预测模型
导读:AI大模型日报,爬虫LLM自动生成,一文览尽每日AI大模型要点资讯!目前采用“文心一言”(ERNIE 4.0)、“零一万物”(Yi-Large)生成了今日要点以及每条资讯的摘要。欢迎阅读…...
速盾:图片cdn加速 免费
随着互联网的快速发展,图片在网页设计和内容传播中起着重要的作用。然而,随着网站访问量的增加和图片文件大小的增加,图片加载速度可能会成为一个问题。为了解决这个问题,许多网站使用图片CDN加速服务。 CDN(Content …...
贪心算法例子
贪心算法概述 贪心算法是一种在每一步选择中都做出局部最优选择的算法,以期望通过一系列局部最优选择达到全局最优。贪心算法在许多优化问题中表现良好,特别是在某些特定类型的问题中能够保证找到最优解。 活动选择问题(Activity Selection Problem)背包问题(贪心解法)霍…...
vivado HW_ILA_DATA、HW_PROBE
HW_ILA_DATA 描述 硬件ILA数据对象是ILA调试核心上捕获的数据的存储库 编程到当前硬件设备上。upload_hw_ila_data命令 在从ila调试移动捕获的数据的过程中创建hw_ila_data对象 核心,hw_ila,在物理FPGA上,hw_device。 read_hw_ila_data命令还…...
refault distance算法的一点理解
这个算法看了好几次了,都没太理解,今天记录一下,加深一下印象。 引用某个博客对这个算法的介绍 一次访问page cache称为fault,第二次访问该页面称为refault。page cache页面第一次被踢出LRU链表并回收(eviction)的时刻称为E&#…...
软件安全技术【太原理工大学】
没有划重点,只说了一句课后题和实验中的内容都可能会出。 2022考试题型:选择20个20分,填空10个10分,名词解释4个20分,简答6个30分,分析与论述2个20分,没找到历年题。 如此看来,这门考…...
异常(Exception)
异常是什么 异常就是程序在进行时的不正常行为,就像之前数组时会遇到空指针异常(NullPointerException),数组越界异常(ArrayIndexOutOfBoundsException)等等。 在java中异常由类来表示。 异常的分类 异常…...
一文者懂LLaMA 2(原理、模型、训练)
引言 LLaMA(Large Language Model Meta AI)是Meta(前身为Facebook)开发的自然语言处理模型家族之一,LLaMA 2作为其最新版本,展示了在语言理解和生成方面的显著进步。本文将详细解读LLaMA 2的基本原理、模型…...
MySQL 存储函数及调用
1.mysql 存储函数及调用 在MySQL中,存储函数(Stored Function)是一种在数据库中定义的特殊类型的函数,它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑,使得在应用程序中调用时更加简单…...
设计模式七大原则-单一职责原则SingleResponsibility
七大原则是在设计“设计模式”的时候需要用到的原则,它们的存在是为了保证设计模式达到以下几种目的: 1.代码重用性 2.可读性 3.可拓展性 4.可靠性(增加新的功能后,对原来的功能没有影响) 5.使程序呈现高内聚、低耦合的…...
msfconsole利用Windows server2008cve-2019-0708漏洞入侵
一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services(远程桌面服务)(端口3389)中,未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞,可能导致远程无需用户验…...
Reinforcement Learning学习(三)
前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…...
hw meta10 adb back up DCIM
1. centos install adb 2. HW enable devlepment mode & enalbe adb debug 3. add shell root/zt/adb-sync python3 ./adb-sync --reverse /sdcard/DCIM/Camera /root/zt/meta10...
Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)
上期链接:Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算,我们先给人物和野猪挂上属性和攻击属性的代码,然后通过触发器触发受伤的事件。物体(人物也好敌人也行ÿ…...
从河流到空气,BL340工控机助力全面环保监测网络构建
在环保监测领域,智能化、高效率的监测手段正逐步成为守护绿水青山的新常态。其中,ARMxy工业计算机BL340凭借其强大的处理能力、高度的灵活性以及广泛的兼容性,在水质监测站、空气质量检测、噪音污染监控等多个环保应用场景中脱颖而出…...
零拷贝技术
背景 磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的…...
Flutter_Android上架GooglePlay_问题
上架GooglePlay权限问题 问题描述 REQUEST_INSTALL_PACKAGES 权限问题解决方式 方式1 找到所有使用该权限的库修改删除该权限引用 方式2 打开项目 ~/andoird/app/src/main/AndroidMainfest.xml 添加文本<uses-permission android:name"android.permission.REQUES…...
【Java】解决Java报错:NumberFormatException
文章目录 引言1. 错误详解2. 常见的出错场景2.1 字符串包含非数字字符2.2 空字符串或 null 字符串2.3 数值超出范围 3. 解决方案3.1 验证字符串格式3.2 使用异常处理3.3 处理空字符串和 null 4. 预防措施4.1 数据验证4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程中&a…...
视觉大模型(VLLM)学习笔记
视觉多模态大模型(VLLM) InternVL 1.5 近日,上海人工智能实验室 OpenGVLab 团队、清华大学、商汤科技合作推出了开源多模态大语言模型项目InternVL 1.5,它不仅挑战了商业模型巨头例如 GPT-4V 的霸主地位,还让我们不禁…...
网站资讯建设/关键词分为哪三类
1、lua中的标识符可以是由任意字母、数字和下划线构成的字符串,但不能以数字开头。2、lua将通常类似"_VALUE"的标识符作为保留标识符3、lua的保留字 and break do else elseif end false for function if in loacl nil not or repear return then true un…...
顺德网站建设公司/浏览器老是出现站长工具
上周我遇到了最近的Authorize.net SSL证书失效debacle。我终于让curl接受了他们的证书:$ curl -Iv https://secure.authorize.net...* SSL certificate verify ok....但python仍然拒绝了它的请求:>>> requests.get(https://secure.authorize.ne…...
网站架构模板/网站流量统计工具有哪些
1.修饰变量 1.1 作用 功能:不能直接被修改 const修饰变量,就相当于是定义了一个常量。该变量不能直接被修改,但是可以通过指针修改。 作用:便于维护、提前发现可能错误的修改 比如程序中大量使用了一个数字10,且不会…...
网站维护收费/搜索引擎搜索器
We’ve already shown you how to celebrate Halloween by turning your friends into ghosts, now we’ll show you how to turn them into the hungry dead with a fun video how-to. Grab some Facebook photos and give it a shot! 我们已经向您展示了如何通过将您的朋友变…...
企业展厅策划方案/杭州明开seo
1、网络慢的原因:网络问题经常以两种形式出现。第一种是来自远程服务器的慢速响应,第二种是完全失去连接。网络慢的根源主要有网卡的双工和速度的不兼容、网络拥塞、不良的路由、线缆问题、电阻或电波干扰、远端服务器负载过重、DNS配置不当。连接丢失的…...
app网站开发定制/重庆做优化的网络公司
开源SOA厂商WSO2周一在OSGi基础上推出SOA的组件框架,目的在于使用户不必安装过多的软件根据自身需要进行部署组装。 他们将该框架称为Carbon框架,它将首先以升级公司企业服务总线、应用服务器、注册表以及业务流程管理产品为特点。WSO2表示开发者能够部署…...