从上图可以看出,
NioEventLoopGroup
实现了
Executor
、
ExecutorService
、
ScheduledExecutorService
、
Iterable
、
EventExecutorGroup
、
EventLoopGroup
接口,另外三个抽象类
AbstractEventExecutorGroup
、
MultithreadEventExecutorGroup
、
MultithreadEventLoopGroup
提供了接口的部分实现。
AbstractEventExecutorGroup
实现了Executor
、ExecutorService
、ScheduledExecutorService
中的部分方法,都是委托给next()
方法返回的EventExecutor
MultithreadEventExecutorGroup
主要是创建了EventExecutor[] children
数组,并将多个方法委托给children
MultithreadEventLoopGroup
将EventExecutor
类型的chlild
转化成EventLoop
(EventExecutor
的子接口),并将register()
方法委托给EventLoop
NioEventLoopGroup
实现newChild()
方法,返回NioEventLoop
(EventLoop的实现类),并将几个方法委托给NioEventLoop
Executor
Executor
接口比较简单,只有一个execute()
方法,该方法在未来某个时间点执行参数Runnable
实例,可以在当前线程、新建线程或线程池里面执行,取决于具体实现。
public interface Executor {
void execute(Runnable command);
}
ExecutorService
ExecutorService
继承了Executor
,是建立在Executor
基础上的一个服务,它是Executor
基础上增加了任务管理服务。 除了执行任务的基础功能外,ExecutorService
还提供submit
类方法,用于提交任务,并返回futrue
实例(可以用于取消执行任务,或者等待执行完成)用于和任务进行通信。 同时,还支持对Executor
进行shutdown()
操作,这一步可以用于资源的释放。
public interface ExecutorService extends Executor {
//拒绝新任务,但在terminate之前可以执行先前提交的任务
void shutdown();
//拒绝新任务,并删除之前提交的正在等待执行的任务,同时会尝试终止正在执行的任务
List shutdownNow();
boolean isShutdown();
/**如果shutdown后所有任务都已完成,则返回true。
请注意,除非先调用shutdown或shutdownNow,否则isTerminated永远不会为真。**/
boolean isTerminated();
//阻塞,直到shutdown后剩下的所有任务被完成,或者等待超时,或者被中断(interrupted)
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
//提交任务,返回的Future实例可以用于取消执行任务,或者等待执行完成
Future submit(Callable task);
Future submit(Runnable task, T result);
Future submit(Runnable task);
List> invokeAll(Collection> tasks)
throws InterruptedException;
List> invokeAll(Collection> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
T invokeAny(Collection> tasks)
throws InterruptedException, ExecutionException;
T invokeAny(Collection> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
Executors
类提供ExecutorService
类的多个工厂方法。
ScheduledExecutorService
ScheduledExecutorService
可以在给定延时后执行任务,或者定期执行任务。 scheduleAtFixedRate
和scheduleWithFixedDelay
方法创建并执行定期运行的任务,直到被取消。 scheduleAtFixedRate
表示每隔多少时间,执行一次任务。 scheduleWithFixedDelay
等到前一个任务结束的时刻,才开始结算间隔时间,如0秒开始执行第一次任务,任务耗时5秒,任务间隔时间3秒,那么第二次任务执行的时间是在第8秒开始。 通过 Executor.execute(Runnable)
和ExecutorService的submit()
方法提交的任务延迟时间为0。
public interface ScheduledExecutorService extends ExecutorService {
public ScheduledFuture schedule(Runnable command,
long delay, TimeUnit unit);
public ScheduledFuture schedule(Callable callable,
long delay, TimeUnit unit);
public ScheduledFuture scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
public ScheduledFuture scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
}
EventExecutorGroup
EventExecutorGroup
负责通过next()
方法提供EventExecutor
。 除此之外,它还负责处理它们的生命周期并允许以全局的方式关闭它们。
public interface EventExecutorGroup extends ScheduledExecutorService, Iterable {
//当被此EventExecutorGroup管理的所有EventExecutor被shutdown或者被shutdownGracefully时,返回true
boolean isShuttingDown();
//向executor发出关闭信号,此方法一旦被调用,isShuttingDown()就返回true,然后executor准备关闭自己
Future shutdownGracefully();
Future shutdownGracefully(long quietPeriod, long timeout, TimeUnit unit);
//返回一个future,当所有被当前这个EventExecutorGroup管理的EventExecutor被终止时,会通知这个future
Future terminationFuture();
//返回一个EventExecutor
EventExecutor next();
//被shutdownGracefully方法替代
@Override
@Deprecated
void shutdown();
//被shutdownGracefully方法替代
@Override
@Deprecated
List shutdownNow();
@Override
Iterator iterator();
@Override
Future submit(Runnable task);
@Override
Future submit(Runnable task, T result);
@Override
Future submit(Callable task);
@Override
ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit);
@Override
ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit);
@Override
ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);
@Override
ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);
}
EventLoopGroup
EventLoopGroup
是特殊的EventExecutorGroup
,它可以注册channel
,被注册的channel会在事件循环(event loop
)中被select和处理。
public interface EventLoopGroup extends EventExecutorGroup {
//返回下一个EventLoop
@Override
EventLoop next();
//注册Channel,返回的ChannelFuture会在注册完成时得到通知
ChannelFuture register(Channel channel);
ChannelFuture register(ChannelPromise promise);
@Deprecated
ChannelFuture register(Channel channel, ChannelPromise promise);
}
AbstractEventExecutorGroup
AbstractEventExecutorGroup
只是将部分方法的实现的委托给next()
方法返回的EventExecutor
,但是没具体实现next()
方法。
public abstract class AbstractEventExecutorGroup implements EventExecutorGroup {
@Override
public Future submit(Runnable task) {
return next().submit(task);
}
@Override
public Future submit(Runnable task, T result) {
return next().submit(task, result);
}
@Override
public Future submit(Callable task) {
return next().submit(task);
}
@Override
public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) {
return next().schedule(command, delay, unit);
}
@Override
public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) {
return next().schedule(callable, delay, unit);
}
@Override
public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
return next().scheduleAtFixedRate(command, initialDelay, period, unit);
}
@Override
public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
return next().scheduleWithFixedDelay(command, initialDelay, delay, unit);
}
@Override
public Future shutdownGracefully() {
return shutdownGracefully(DEFAULT_SHUTDOWN_QUIET_PERIOD, DEFAULT_SHUTDOWN_TIMEOUT, TimeUnit.SECONDS);
}
/**
* @deprecated {@link #shutdownGracefully(long, long, TimeUnit)} or {@link #shutdownGracefully()} instead.
*/
@Override
@Deprecated
public abstract void shutdown();
/**
* @deprecated {@link #shutdownGracefully(long, long, TimeUnit)} or {@link #shutdownGracefully()} instead.
*/
@Override
@Deprecated
public List shutdownNow() {
shutdown();
return Collections.emptyList();
}
@Override
public List> invokeAll(Collection> tasks)
throws InterruptedException {
return next().invokeAll(tasks);
}
@Override
public List> invokeAll(
Collection> tasks, long timeout, TimeUnit unit) throws InterruptedException {
return next().invokeAll(tasks, timeout, unit);
}
@Override
public T invokeAny(Collection> tasks) throws InterruptedException, ExecutionException {
return next().invokeAny(tasks);
}
@Override
public T invokeAny(Collection> tasks, long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
return next().invokeAny(tasks, timeout, unit);
}
@Override
public void execute(Runnable command) {
next().execute(command);
}
}
MultithreadEventExecutorGroup
MultithreadEventExecutorGroup
主要是创建了EventExecutor[] children
数组,并将多个方法委托给children
。
public abstract class MultithreadEventExecutorGroup extends AbstractEventExecutorGroup {
private final EventExecutor[] children;
private final Set readonlyChildren;
private final AtomicInteger terminatedChildren = new AtomicInteger();
private final Promise terminationFuture = new DefaultPromise(GlobalEventExecutor.INSTANCE);
private final EventExecutorChooserFactory.EventExecutorChooser chooser;
protected MultithreadEventExecutorGroup(int nThreads, ThreadFactory threadFactory, Object... args) {
this(nThreads, threadFactory == null ? null : new ThreadPerTaskExecutor(threadFactory), args);
}
protected MultithreadEventExecutorGroup(int nThreads, Executor executor, Object... args) {
this(nThreads, executor, DefaultEventExecutorChooserFactory.INSTANCE, args);
}
protected MultithreadEventExecutorGroup(int nThreads, Executor executor,
EventExecutorChooserFactory chooserFactory, Object... args) {
if (nThreads <= 0) {
throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads));
}
if (executor == null) {
executor = new ThreadPerTaskExecutor(newDefaultThreadFactory());
}
children = new EventExecutor[nThreads];
for (int i = 0; i < nThreads; i ++) {
boolean success = false;
try {
children[i] = newChild(executor, args);
success = true;
} catch (Exception e) {
// TODO: Think about if this is a good exception type
throw new IllegalStateException("failed to create a child event loop", e);
} finally {
if (!success) {
for (int j = 0; j < i; j ++) {
children[j].shutdownGracefully();
}
for (int j = 0; j < i; j ++) {
EventExecutor e = children[j];
try {
while (!e.isTerminated()) {
e.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
}
} catch (InterruptedException interrupted) {
// Let the caller handle the interruption.
Thread.currentThread().interrupt();
break;
}
}
}
}
}
chooser = chooserFactory.newChooser(children);
final FutureListener terminationListener = new FutureListener() {
@Override
public void operationComplete(Future future) throws Exception {
if (terminatedChildren.incrementAndGet() == children.length) {
terminationFuture.setSuccess(null);
}
}
};
for (EventExecutor e: children) {
e.terminationFuture().addListener(terminationListener);
}
Set childrenSet = new LinkedHashSet(children.length);
Collections.addAll(childrenSet, children);
readonlyChildren = Collections.unmodifiableSet(childrenSet);
}
protected ThreadFactory newDefaultThreadFactory() {
return new DefaultThreadFactory(getClass());
}
@Override
public EventExecutor next() {
return chooser.next();
}
@Override
public Iterator iterator() {
return readonlyChildren.iterator();
}
public final int executorCount() {
return children.length;
}
protected abstract EventExecutor newChild(Executor executor, Object... args) throws Exception;
@Override
public Future shutdownGracefully(long quietPeriod, long timeout, TimeUnit unit) {
for (EventExecutor l: children) {
l.shutdownGracefully(quietPeriod, timeout, unit);
}
return terminationFuture();
}
@Override
public Future terminationFuture() {
return terminationFuture;
}
@Override
@Deprecated
public void shutdown() {
for (EventExecutor l: children) {
l.shutdown();
}
}
@Override
public boolean isShuttingDown() {
for (EventExecutor l: children) {
if (!l.isShuttingDown()) {
return false;
}
}
return true;
}
@Override
public boolean isShutdown() {
for (EventExecutor l: children) {
if (!l.isShutdown()) {
return false;
}
}
return true;
}
@Override
public boolean isTerminated() {
for (EventExecutor l: children) {
if (!l.isTerminated()) {
return false;
}
}
return true;
}
@Override
public boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException {
long deadline = System.nanoTime() + unit.toNanos(timeout);
loop: for (EventExecutor l: children) {
for (;;) {
long timeLeft = deadline - System.nanoTime();
if (timeLeft <= 0) {
break loop;
}
if (l.awaitTermination(timeLeft, TimeUnit.NANOSECONDS)) {
break;
}
}
}
return isTerminated();
}
}
MultithreadEventLoopGroup
MultithreadEventLoopGroup
将EventExecutor
类型的chlild
转化成EventLoop
(EventExecutor
的子接口),并将register()
方法委托给EventLoop
。
public abstract class MultithreadEventLoopGroup extends MultithreadEventExecutorGroup implements EventLoopGroup {
private static final InternalLogger logger = InternalLoggerFactory.getInstance(MultithreadEventLoopGroup.class);
private static final int DEFAULT_EVENT_LOOP_THREADS;
static {
DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt(
"io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
if (logger.isDebugEnabled()) {
logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS);
}
}
protected MultithreadEventLoopGroup(int nThreads, Executor executor, Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, args);
}
protected MultithreadEventLoopGroup(int nThreads, ThreadFactory threadFactory, Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, threadFactory, args);
}
protected MultithreadEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory,
Object... args) {
super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, executor, chooserFactory, args);
}
@Override
protected ThreadFactory newDefaultThreadFactory() {
return new DefaultThreadFactory(getClass(), Thread.MAX_PRIORITY);
}
@Override
public EventLoop next() {
return (EventLoop) super.next();
}
@Override
protected abstract EventLoop newChild(Executor executor, Object... args) throws Exception;
@Override
public ChannelFuture register(Channel channel) {
return next().register(channel);
}
@Override
public ChannelFuture register(ChannelPromise promise) {
return next().register(promise);
}
@Deprecated
@Override
public ChannelFuture register(Channel channel, ChannelPromise promise) {
return next().register(channel, promise);
}
}
NioEventLoopGroup
NioEventLoopGroup
实现newChild()
方法,返回NioEventLoop
(EventLoop的实现类),并将几个方法委托给NioEventLoop
。
public class NioEventLoopGroup extends MultithreadEventLoopGroup {
public NioEventLoopGroup() {
this(0);
}
public NioEventLoopGroup(int nThreads) {
this(nThreads, (Executor) null);
}
public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory) {
this(nThreads, threadFactory, SelectorProvider.provider());
}
public NioEventLoopGroup(int nThreads, Executor executor) {
this(nThreads, executor, SelectorProvider.provider());
}
public NioEventLoopGroup(
int nThreads, ThreadFactory threadFactory, final SelectorProvider selectorProvider) {
this(nThreads, threadFactory, selectorProvider, DefaultSelectStrategyFactory.INSTANCE);
}
public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory,
final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory) {
super(nThreads, threadFactory, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject());
}
public NioEventLoopGroup(
int nThreads, Executor executor, final SelectorProvider selectorProvider) {
this(nThreads, executor, selectorProvider, DefaultSelectStrategyFactory.INSTANCE);
}
public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider,
final SelectStrategyFactory selectStrategyFactory) {
super(nThreads, executor, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject());
}
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory,
final SelectorProvider selectorProvider,
final SelectStrategyFactory selectStrategyFactory) {
super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory,
RejectedExecutionHandlers.reject());
}
public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory,
final SelectorProvider selectorProvider,
final SelectStrategyFactory selectStrategyFactory,
final RejectedExecutionHandler rejectedExecutionHandler) {
super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, rejectedExecutionHandler);
}
public void setIoRatio(int ioRatio) {
for (EventExecutor e: this) {
((NioEventLoop) e).setIoRatio(ioRatio);
}
}
public void rebuildSelectors() {
for (EventExecutor e: this) {
((NioEventLoop) e).rebuildSelector();
}
}
@Override
protected EventLoop newChild(Executor executor, Object... args) throws Exception {
return new NioEventLoop(this, executor, (SelectorProvider) args[0],
((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]);
}
}
你可能感兴趣的:(NioEventLoopGroup类)
django orm关联查询_Django框架基于ORM实现外键关联操作 多表查询数据
weixin_39559523
django orm关联查询
我们知道在数据库中可以存在外键关联,那么在django中同样也可以实现。下面我们来创建一个类:fromdjango.dbimportmodelsclassUserGroup(models.Model):pid=models.AutoField(primary_key=True)#创建一个自增的id主键需要设置参数caption=models.CharField(max_length=60)ctim
ApplicationContext 的启动流程是怎样的?
冰糖心书房
2025 Java面试系列 Spring Framework spring
ApplicationContext是SpringIoC容器的核心接口,它提供了配置、访问和管理Bean的功能。ApplicationContext的启动流程可以细分为以下几个关键步骤,这些步骤主要在AbstractApplicationContext类的refresh()方法中实现:1.prepareRefresh()-准备刷新:设置启动时间戳。设置容器的激活状态。初始化属性源(property
Kotlin by关键字实现委托模式
tangweiguo03051987
kotlin 开发语言 android
在Kotlin中,by关键字主要用于委托(Delegation)。它允许将一个类的某些功能委托给另一个对象来处理。Kotlin提供了两种主要的委托方式:类委托和属性委托。委托的主要组成部分委托对象:负责实现被委托的属性或方法。被委托对象:包含被委托的属性或方法。委托的优点代码简洁:使用委托可以减少代码重复,使代码更加简洁。可扩展性:可以通过修改委托对象来改变被委托属性或方法的行为,而不需要修改原始
Kotlin协变与逆变区别
tangweiguo03051987
kotlin 开发语言 android
在Kotlin中,协变和逆变是泛型编程中的两个重要概念,它们允许我们在类型系统中更加灵活地处理类型关系。1.协变:协变允许我们使用比原始类型更具体的类型。在kotlin中,通过在类型参数上加out关键字来表示协变,生产者,例如,如果我们有一个泛型类List,其中T是一个协变类型参数,那么我们可以将List赋值给List,因为String是Any的子类型。2.逆变:逆变允许我们使用比原始类型更一般的
Java反射
qq_65860758
java 开发语言
Java反射:深入探索与实战应用在Java编程的世界里,反射(Reflection)是一种强大的机制,它允许程序在运行时检查、修改和操作自身的结构和行为。通过反射,你可以动态地获取类的属性、方法、构造函数等信息,甚至可以调用私有方法和访问私有字段。这种能力在框架开发、依赖注入、测试工具等场景中尤为重要。本文将带你深入了解Java反射的工作原理、基本用法以及实战应用。一、反射的基本概念反射的核心在于
Kotlin基础学习(十八)—— Kotlin 运算符重载与约定
浅唱整个春天
Kotlin基础 kotlin 学习 android
Kotlin允许使用对应名称的函数来重载一些标准的数学运算,但是不能定义自己的运算符Kotlin中的约定:为不同操作符规范操作符重载的约定。例如,如果在你的类中定义了一个名为plus的特殊方法,那么按照约定,就可以在该类的实例上使用+运算符。Kotlin允许我们为自己的类型提供预定义的一组操作符的实现。这些操作符具有固定的符号表示(如+或*)和固定的优先级。为实现这样的操作符,我们为相应的类型(即
【Android】聊聊Kotlin操作符重载
AI绘画师-海绵
Kotlin android kotlin
算数运算操作符重载在kotlin中我定义一个类dataclassPoint(valx:Int,valy:Int)然后实例化两个对象valp1=Point(3,5)valp2=Point(5,7)想表示p1的元素x加上p2的元素x,p1的元素y,加上p2的元素y.然后输出一个p3.valp3=Point(p1.x+p2.x,p2.y+p2.y)以上这种写法没有任何问题。不过我们可以利用Kotlin扩
Kotlin快速入门指南:运算符重载与移动端开发
UqndTf__
kotlin 开发语言 android
Kotlin是一门现代化的跨平台编程语言,广泛应用于移动端开发。本文将为您提供一份详细的Kotlin快速入门指南,重点介绍运算符重载的使用和移动端开发的相关内容。我们将通过实例代码来帮助您更好地理解这些概念。运算符重载在Kotlin中,运算符可以被重载,使得它们可以用于不同的数据类型或自定义的类。这种特性可以提高代码的可读性和简洁性。下面我们将通过几个例子来演示如何重载运算符。1.加法运算符重载我
初识React,基础(1), 安装react,jsx文件,类组件和函数组件,css样式
ybilss
react react.js 前端 前端框架
第一部分:初识reactreact:用于构建用户界面的JavaScript库全局安装,win+r,命令:npminstallcreate-react-app-g3.创建一个react应用,这里我在vscode里面创建,创建之后,运行create-react-appmy-appcdmy-appnpmstart第二部分:redact组件定义以及使用react中组件分为两种:类组件和函数组件,一般使用是
Nestjs中怎么自动对应mysql结构的dto和entity?
人工智能
在NestJS中,自动将MySQL数据库的结构映射到DTO(数据传输对象)和Entity(实体类)通常是通过TypeORM(或Sequelize等ORM库)来实现的。你可以通过TypeORM的装饰器来自动映射数据库表结构到实体类,并使用DTO来定义数据交换的格式。下面是如何使用TypeORM自动对应MySQL数据库结构的DTO和Entity的基本步骤。1.安装依赖首先,确保你已经安装了以下依赖:n
Nestjs中怎么自动对应mysql结构的dto和enti
人工智能
在NestJS中,自动将MySQL数据库的结构映射到DTO(数据传输对象)和Entity(实体类)通常是通过TypeORM(或Sequelize等ORM库)来实现的。你可以通过TypeORM的装饰器来自动映射数据库表结构到实体类,并使用DTO来定义数据交换的格式。下面是如何使用TypeORM自动对应MySQL数据库结构的DTO和Entity的基本步骤。1.安装依赖首先,确保你已经安装了以下依赖:n
Android.bp在安卓项目中的构建
wydaicls
Android 代码学习 android
Android.bp是Android构建系统的一部分,主要用于描述模块和它们之间的依赖关系。它使用一种名为Blueprint的DSL(领域特定语言)来定义模块的属性和行为,取代了之前的Android.mk文件。1.基本结构Android.bp文件的基本结构包括:模块类型:定义模块的类型,如cc_library、java_library等。属性:模块的属性,如名称、源文件、依赖关系等。2.常见模块类
Flutter——sdk:状态管理【provider】
wzj_what_why_how
Flutter flutter
providerprovider初识不同类型的provider三个类ChangeNotifierChangeNotifierProviderConsumer实现原理优缺点注意事项provider初识状态管理框架Provider用于提供数据,它的目标就是完全替代StatefulWidget。不同类型的providerProvider最基础的provider组成,接收一个任意值并暴露它。Listena
iOS中的设计模式(六)- 单利模式
胖虎1
iOS中的设计模式 设计模式 单利模式 iOS中单利 Swift单利 OC单利
引言在iOS开发中,单例模式(SingletonPattern)是一种非常常见且实用的设计模式。它通过确保某个类只有一个实例,并提供一个全局的访问点,帮助开发者管理共享资源或提供全局配置。在许多应用场景中,我们需要确保某些对象在整个应用中只有一个实例,以避免资源浪费或不一致的状态。例如,在网络请求管理、数据库连接、日志记录等场景中,单例模式可以简化对象的管理,避免重复创建和销毁实例,提高性能。然而
Java 线程必须了解的哪些事儿
知行小栈
Java 线程篇 java 开发语言
前言对于一名Java开发者,线程是一个绕不开的话题。尽管线程能有效利用系统资源,提高系统的性能,但在使用过程中也伴随不少的问题。今天,『知行』就为大家梳理一下,Java线程中必须要掌握的知识点。线程的创建方式在Java中,线程的创建方式通常有4种方式:继承Thread类,重写run()方法,这种方式受限Java的单继承,灵活性较差;实现Runnable接口,这种方式可避免继承限制,比较灵活;实现C
Mybatis 的代理开发方式
圈圈编码
mybatis java spring
MyBatis的代理开发方式(Mapper接口代理)是其核心特性之一,通过动态代理技术,将Mapper接口的方法调用自动映射到XML或注解中定义的SQL语句。这种方式避免了手动编写DAO实现类,极大简化了持久层代码。1.代理开发的核心原理动态代理机制MyBatis在运行时通过JDK动态代理为Mapper接口生成代理对象。当调用接口方法时,代理对象会根据方法名、参数和返回类型,找到对应的SQL并执行
Python使用PyMySQL操作MySQL完整指南
web15117360223
面试 学习路线 阿里巴巴 python mysql 数据库
Python使用PyMySQL操作MySQL完整指南1.安装依赖pipinstallpymysql2.基础配置和数据库操作2.1基础配置类importpymysqlfromtypingimportList,Dict,OptionalfromdatetimeimportdatetimeclassMySQLDB:def__init__(self):self.conn=Noneself.cursor=N
Redis 的几个热点知识
知行小栈
redis redis 数据库 缓存
前言Redis是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。虽然Redis包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些Redis中的热点知识。Redis数据结构Redis中常用的数据结构大致可分为两类:核心类型:String、Hash、List、Set、Zset(SortedSet)扩展类型:Bitmap、Geospatial、Stream
c sharp 特性详解
微笑伴你而行
上位机 上位机 c语言
文章目录一、特性基础用法二、常见的内置特性三、自定义特性四、通过反射读取特性五、实际应用场景六、练习一、特性基础用法什么是特性?特性是一种继承System.Attribute类,用于标记代码元素特性的语法:[AttributeName(Parameter1,Parameter2,NamedParameter=Value)]publicclassMyClass{/*...*/}二、常见的内置特性[O
集合类核心知识
guihong004
java 开发语言
集合类目录1、Java集合框架是什么?说出集合框架的一些优点?2、集合接口的常见实现类3、List和Map区别?4、List、Map、Set三个接口,存取元素时,各有什么特点?5、为什么Map接口不继承Collection接口?6、Iterator和ListIterator之间有什么区别?7、集合框架中的泛型有什么优点?8、Map接口提供了哪些不同的集合视图?9、jdk1.7HashMap10、j
【Java】反射
茉菇
java python 开发语言
一、概述Java反射(Reflection)机制是Java语言的一项核心特性,允许程序在运行时动态地获取类的信息、操作类的属性和方法,甚至修改类的行为。这种能力突破了传统静态编程的限制,是框架开发(如Spring、Hibernate)和动态代理的核心基础。1、反射的核心概念动态性:在编译期无需知道类的具体信息,运行时动态加载和操作类。元数据(Metadata):反射通过访问类的元数据(如类名、方法
2021Java面试-基础篇
web13093320398
面试 学习路线 阿里巴巴 面试 python 职场和发展
文章目录前言一:Java概述1、何为编程2、JDK1.5之后的三大版本3、JVM,JRE和JDK的关系4、什么是跨平台?原理是什么5、Java语言有哪些特点6、什么是字节码?采用字节码的最大好处是什么7、什么是Java程序的主类?应用程序和小程序的主类有何不同8、Java应用程序与小程序之间有哪些差别9、Java和C++的区别10、OracleJDK和OpenJDK的对比二:基础语法数据类型11、
Java多线程--创建多线程的基本方式二:实现Runnable接口
雨翼轻尘
Java基础 java 多线程 创建多线程的基本方式二 实现Runnable接口
文章目录一、方式2:实现Runnable接口(1)步骤(2)举例1、案例12、案例23、案例3(3)代码及总结二、练习(1)方式一、继承Thread类1、方法1:继承Thread类--标准写法2、方法2:继承Thread类--变形写法(2)方式二、实现Runnable接口1、方法3:实现Runnable接口--标准写法2、方法4:实现Runnable接口--变形写法一、方式2:实现Runnable
(leetcode学习)295. 数据流的中位数
我不是彭于晏丶
leetcode 学习 c++ 算法
中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。例如arr=[2,3,4]的中位数是3。例如arr=[2,3]的中位数是(2+3)/2=2.5。实现MedianFinder类:MedianFinder()初始化MedianFinder对象。voidaddNum(intnum)将数据流中的整数num添加到数据结构中。doublefindMedian()
Selenium—显式等待中的EC模块参数大全
far_208
selenium 测试工具
最近学到了expected_conditions模块(在使用时通常重命名为EC模块),在显式等待WebDriverWait的until和until_not方法中我们经常要用到,它会根据网页标题、网址以及元素是否可见等条件来决定我们是否需要继续等待。后面又使用到了其他参数,根据各大类型对它们做了个整理,方便记忆。因为要使用expected_conditions(EC)模块中的类,所以第一步肯定是要引
线程池(四):手写线程池实战
斯音
android java 线程池
一、线程池实战例子项目背景:需要查出一百个用户的信息,并且给他们的邮箱发送邮件,打印出最终结果用户类publicclassUser{privateIntegerid;privateStringemail;publicUser(Integerid,Stringemail){this.id=id;this.email=email;}publicStringgetEmail(){returnemail;
聚类分析tensorflow实例_新手必看的机器学习算法集锦(聚类篇)
道酝欣赏
继上一篇《机器学习算法之分类》中大致梳理了一遍在机器学习中常用的分类算法,类似的,这一姊妹篇中将会梳理一遍机器学习中的聚类算法,最后也会拓展一些其他无监督学习的方法供了解学习。1.机器学习机器学习是近20多年兴起的一门多领域交叉学科,它涉及到概率论、统计学、计算机科学以及软件工程等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。机器学习算法是一类能从数据中自动分析获得规律
Java中的接口(Interface)和抽象类(Abstract Class)的区别
萌新coder
Java基础知识 java 开发语言 面试
Java中的接口(Interface)和抽象类(AbstractClass)的区别Java中的接口(Interface)和抽象类(AbstractClass)是两种实现抽象化的核心机制,它们在语法、设计目的和应用场景上有显著区别。以下从多个维度详细分析,并结合示例说明:一、语法结构差异成员变量抽象类:可以包含普通成员变量(非静态、可修改)、静态变量,且变量可被子类继承或重定义。publicabst
C/C++类型转换的本质
yhwang-hub
C++
在C/C++中,不同的数据类型之间可以相互转换:无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换(显式类型转换),这点已在《C++转换构造函数》中进行了说明。隐式类型转换利用的是编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换函数(这些都可以认为是已知的转换规则),例如从int到double、从派生类到基类、从type*到void*
软件架构的23个基本原则:构建稳健、可扩展的系统
潘多编程
java 开发语言
软件架构是任何软件项目成功的关键。良好的架构不仅能够支撑软件的功能实现,还能确保其性能、可维护性、可扩展性和安全性。在软件工程领域,经过多年的研究和实践,已经总结出了许多宝贵的原则和模式,用以指导软件架构的设计。以下是软件架构的23个基本原则,这些原则涵盖了从设计模式到架构风格,从组件交互到系统集成的方方面面,旨在帮助软件工程师和架构师构建更加稳健、可扩展的系统。单一职责原则(SRP)每个模块或类
ASM系列四 利用Method 组件动态注入方法逻辑
lijingyao8206
字节码技术 jvm AOP 动态代理 ASM
这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以
java编程思想 --内部类
百合不是茶
java 内部类 匿名内部类
内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅
1,内部类的创建 内部类是创建在类中的
package com.wj.InsideClass;
/*
* 内部类的创建
*/
public class CreateInsideClass {
public CreateInsideClass(
web.xml报错
crabdave
web.xml
web.xml报错
The content of element type "web-app" must match "(icon?,display-
name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s
泛型类的自定义
麦田的设计者
java android 泛型
为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。
采用泛型类,完成扩展。
例如有一个学生类
Student{
Student(){
System.out.println("I'm a student.....");
}
}
有一个老师类
CSS清除浮动的4中方法
IT独行者
JavaScript UI css
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。
1、结尾处加空div标签 clear:both 1 2 3 4
.div
1
{
background
:
#000080
;
border
:
1px
s
Cygwin使用windows的jdk 配置方法
_wy_
jdk windows cygwin
1.[vim /etc/profile]
JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43" (windows下jdk路径为D:\Java\jdk1.6.0_43)
PATH="$JAVA_HOME/bin:${PATH}"
CLAS
linux下安装maven
无量
maven linux 安装
Linux下安装maven(转) 1.首先到Maven官网
下载安装文件,目前最新版本为3.0.3,下载文件为
apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令;
2.进入下载文件夹,找到下载的文件,运行如下命令解压
tar -xvf apache-maven-2.2.1-bin.tar.gz
解压后的文件夹
tomcat的https 配置,syslog-ng配置
aichenglong
tomcat http跳转到https syslong-ng配置 syslog配置
1) tomcat配置https,以及http自动跳转到https的配置
1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令)
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit
关于领号活动总结
alafqq
活动
关于某彩票活动的总结
具体需求,每个用户进活动页面,领取一个号码,1000中的一个;
活动要求
1,随机性,一定要有随机性;
2,最少中奖概率,如果注数为3200注,则最多中4注
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高);
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库)
解决方案
1,事先产生随机数1000个,并打
java数据结构 冒泡排序的遍历与排序
百合不是茶
java
java的冒泡排序是一种简单的排序规则
冒泡排序的原理:
比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样;
针对所有的元素重复以上的步骤,除了最后一个
例题;将int array[]
JS检查输入框输入的是否是数字的一种校验方法
bijian1013
js
如下是JS检查输入框输入的是否是数字的一种校验方法:
<form method=post target="_blank">
数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br>
</form>
Test注解的两个属性:expected和timeout
bijian1013
java JUnit expected timeout
JUnit4:Test文档中的解释:
The Test annotation supports two optional parameters.
The first, expected, declares that a test method should throw an exception.
If it doesn't throw an exception or if it
[Gson二]继承关系的POJO的反序列化
bit1129
POJO
父类
package inheritance.test2;
import java.util.Map;
public class Model {
private String field1;
private String field2;
private Map<String, String> infoMap
【Spark八十四】Spark零碎知识点记录
bit1129
spark
1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的
ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中
WAS各种脚本作用大全
ronin47
WAS 脚本
http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html
无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下
获取下载
这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自
java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
bylijinnan
switch
借鉴网上的思路,用java实现:
public class NoIfWhile {
/**
* @param args
*
* find x=1+2+3+....n
*/
public static void main(String[] args) {
int n=10;
int re=find(n);
System.o
Netty源码学习-ObjectEncoder和ObjectDecoder
bylijinnan
java netty
Netty中传递对象的思路很直观:
Netty中数据的传递是基于ChannelBuffer(也就是byte[]);
那把对象序列化为字节流,就可以在Netty中传递对象了
相应的从ChannelBuffer恢复对象,就是反序列化的过程
Netty已经封装好ObjectEncoder和ObjectDecoder
先看ObjectEncoder
ObjectEncoder是往外发送
spring 定时任务中cronExpression表达式含义
chicony
cronExpression
一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示:
代表含义 是否必须 允许的取值范围 &nb
Nutz配置Jndi
ctrain
JNDI
1、使用JNDI获取指定资源:
var ioc = {
dao : {
type :"org.nutz.dao.impl.NutDao",
args : [ {jndi :"jdbc/dataSource"} ]
}
}
以上方法,仅需要在容器中配置好数据源,注入到NutDao即可.
解决 /bin/sh^M: bad interpreter: No such file or directory
daizj
shell
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决:
1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具
[转]for 循环为何可恨?
dcj3sjt126com
程序员 读书
Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。
不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju
Android实用小技巧
dcj3sjt126com
android
1、去掉所有Activity界面的标题栏
修改AndroidManifest.xml 在application 标签中添加android:theme="@android:style/Theme.NoTitleBar"
2、去掉所有Activity界面的TitleBar 和StatusBar
修改AndroidManifes
Oracle 复习笔记之序列
eksliang
Oracle 序列 sequence Oracle sequence
转载请出自出处:http://eksliang.iteye.com/blog/2098859
1.序列的作用
序列是用于生成唯一、连续序号的对象
一般用序列来充当数据库表的主键值
2.创建序列语法如下:
create sequence s_emp
start with 1 --开始值
increment by 1 --増长值
maxval
有“品”的程序员
gongmeitao
工作
完美程序员的10种品质
完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的
完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质:
1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强
(范围:用简单方式解决复杂问题)
使用KeleyiSQLHelper类进行分页查询
hvt
sql .net C# asp.net hovertree
本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D
SVG 教程 (三)圆形,椭圆,直线
天梯梦
svg
SVG <circle> SVG 圆形 - <circle>
<circle> 标签可用来创建一个圆:
下面是SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" c
链表栈
luyulong
java 数据结构
public class Node {
private Object object;
private Node next;
public Node() {
this.next = null;
this.object = null;
}
public Object getObject() {
return object;
}
public
基础数据结构和算法十:2-3 search tree
sunwinner
Algorithm 2-3 search tree
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga
spring配置定时任务
stunizhengjia
spring timer
最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到:
//------------------------定时任务调用的方法------------------------------
/**
* 存储过程定时器
*/
publi
ITeye 8月技术图书有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
8月试读活动回顾:
http://webmaster.iteye.com/blog/2102830
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《跨终端Web》
gleams:http