卡密社区源码⽆加密完整版(php源码+mysql脚本)
PHP卡密社区系统源码|卡密⾃动发货源码(⽆加密全开源)是⼀套基于php+mysql开发制作的在线卡密系统源码!程序全开源⽆加密!功能如下:
1.在线下单
2.⽤户系统
⽤户后台(域名/user)
3.分站系统
分站后台(域名/admin)
4.订单管理页⾯可查看⽀付⽅式与⾦额
5.订单管理页⾯可直接修改下单数据
6.⾃助开通分站后跳转到分站信息页⾯
7.对接卡盟(卡易信、卡乐购)社区(亿乐,玖五,等等系统)
8.快⼿ID⽀持⽤户⾃定义ID
9.快⼿作品ID增加⾃动获取按钮
10.增加⼀键复制其他站点公告排版
11.修复部分卡密⽆法判断已使⽤问题
12.等等功能下载使⽤
⽂件:(访问密码:551685)
以下内容⽆关:
-------------------------------------------分割线---------------------------------------------
⼀、线程的基本知识
1.1 线程知识importance level assets
进程和线程的关系和区别
线程:
线程是进程的基本执⾏单元,进程想要执⾏任务,必须要有线程。程序启动默认开启⼀条线程,这个线程被称为主线程。
进程:
进程是指在系统中正在运⾏的⼀个应⽤程序。每个进程之间是独⽴的,每个进程均运⾏在其专⽤且受保护的内存⾥。
线程的六个状态:
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
Thread流程图:
Thread的⽅法:
⽅法 说明
void join() t.join() 当前线程调⽤其他线程的t.join()⽅法,当前线程进⼊等待状态,当前线程不会释
放已经持有的锁。线程t执⾏完毕后,当前线程进⼊就绪状态。
static native void sleep() 静态⽅法,线程睡眠,并让出CPU时间⽚
void wait() 当前线程调⽤对象的wait()⽅法,当前线程释放对象锁,进⼊等待队列。依靠notify()/notifyAll()唤醒。
native void notify() 唤醒在此对象监视器上等待的单个线程,选择是任意性的。
native void notifyAll() 发送信号通知所有等待线程
1.2 线程安全
并发的相关性质:
原⼦性:原⼦操作。对基本数据类型的读取和赋值操作是原⼦性操作,即这些操作是不可被中断的,要么执⾏,要么不执⾏。
可见性:对于可见性,java提供了volatile关键字来保证可见性。
当⼀个共享变量被volatile修饰时,他会保证修改的值会⽴即被更新到主存,当有其他线程需要读取时,
他会去主存中读取新值。
volatile 不保证原⼦性。
有序性:Java允许编译器和处理器对指令重排序,但是重排序不会影响到单线程的执⾏,却会影响到多线程并发执⾏的正确性。
synchronized
laser printer使⽤对象头标记字实现
使⽤场景:
修饰⽅法:
⼀个对象中的加锁⽅法只允许⼀个线程访问。
修饰静态⽅法:
由于静态⽅法是类⽅法,所以多个线程不同对象访问这个静态⽅法,也是可以保证同步的。
修饰代码块:
mysql是什么系统如:synchronized(obj){…} 这⾥的obj可以是类中的⼀个属性,也可以是对象,这时他跟修饰普通⽅法⼀样,如果obj是Object.class这样的,那么效果跟修饰静态⽅法类似。
volatile
每次读取都强制从主内存刷数据
适⽤场景:单个线程写,多个线程读
原则:能不⽤就不⽤,不确定的时候也不⽤
语义
可见性
禁⽌指令重排序(不完全保证有序性)
不能保证原⼦性。
为什么不保证有序性呢?举个例⼦说明
上述代码,语句1和2,不会被重排到3的后⾯,4和5也不会到3的前⾯。但是1和2的顺序、4和5的顺序⽆法保证。
final
final定义类型 说明
海外支付方式final class XXX 不允许继承
final ⽅法 不允许Override
final 局部变量 不允许修改
final 实例属性 构造函数、初始化块后不能变更。只能赋值⼀次。构造函数结束返回时,final域最新的值保证对其他线程可见。
final static 属性 静态块执⾏后不允许变更,只能赋值⼀次
⼆、线程池
Executor :执⾏者 -顶层接⼝
ExecutorService :继承于Executor,线程池的接⼝API
ThreadFactory:线程⼯才数组的动态初始化c语言
Executors:⼯具类
submit⽅法和execute⽅法的区别:
submit⽅法:有返回值,⽤Future封装,执⾏的⽅法异常了可以在主线程⾥catch到。
execute⽅法:⽆返回值,⽅法执⾏异常是捕捉不到的
如下图:
ExecutorService主要⽅法:
构造线程池的参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
corePoolSize :核⼼线程数
maximumPoolSize:最⼤线程数
keepAliveTime:当线程数超过了核⼼线程数,空闲线程需要等待多久等待不到新任务就终⽌。
workQueue:任务队列
threadFactory:线程⼯⼚
handler:拒绝策略
提交任务逻辑:
判断核⼼线程数
加⼊workQueue
判断最⼤线程数,没达到就创建
执⾏拒绝策略(默认是抛异常)
缓冲队列
bin文件用什么软件打开ArrayBlockingQueue:规定⼤⼩的BlockingQueue,构造时必须指定⼤⼩
LinkedBlockingQueue:⼤⼩不固定的BlockingQueue,如果构造时指定⼤⼩,则有⼤⼩限制,不指定⼤⼩,则⽤Integer.MAX_VALUE 来决定
PriorityBlockingQueue:类似于LinkedBlockingQueue,不同在它根据对象的⾃然顺序或者构造函数的Comparator进⾏排序,不是FIFO
SynchronizedQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成。
拒绝策略:
AbortPolicy:丢弃任务并抛异常
DiscardPolicy:丢弃任务,不抛异常
DiscardOldestPolicy:丢弃队列最前⾯的任务,重新提交被拒绝的任务
CallerRunsPolicy:由提交任务的线程处理该任务。
线程⼯⼚(ThreadFactory):
⾃定义⽰例:
public class CustomThreadFactory implements ThreadFactory {
private AtomicInteger count=new AtomicInteger();
@Override
public Thread newThread(Runnable r) {
Thread thread=new Thread(r);
thread.setDaemon(false);
thread.setName("customThread-"+AndIncrement());
return thread;
}
}
线程⼯具类:
newSingleThreadExecutor
创建⼀个单线程的线程池。如果这个线程因为异常结束,那么会有⼀个新的线程替代它。此线程池保证所有的任务的执⾏顺序按任务提交顺序执⾏。
newFixedThreadPool
创建固定⼤⼩的线程池。缺点:队列使⽤的LinkedBlockingQueue,且没有限制⼤⼩。
newCachedThreadPool
创建⼀个可缓存的队列,如果线程池⼤⼩超过了处理任务需要的线程,那么就会回收部分空闲线程。缺点:此线程池不会对线程池⼤⼩做限制。
newScheduledThreadPool
创建⼀个⼤⼩⽆限的线程池。此线程池⽀持定时以及周期性执⾏任务的需求。
创建固定线程池的经验:
假设服务器核⼼数为N
如果是CPU密集型应⽤,则线程池⼤⼩设置为N或N+1
如果是IO密集型应⽤,则线程池⼤⼩设置为2N或2N+2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论