cpu在处理数据时,同时处理多个任务,就是多线程
main方法执行也是需要线程的,由JVM虚拟机自动创建
Thread t = new Thread;
t.start();
t.run();
t.start()是开启一个新的线程,在新的线程中执行run方法
t.run()是在当前线程中执行run方法
new Thread(Runnable对象).start
FutureTask ft = new FutrueTask(Call对象);
Thread t = new Thread(ft);
t.start();
ft.get();//得到线程执行结果
创建FutureTask对象
创建线程对象
启动线程
get()方法可以获得线程的执行结果
Thread(String name) / void setName(String name)//设置名字
String getName()//获取名字
currentThread()//获取当前线程对象
谁执行就获取谁
sleep(毫秒值)//睡眠/休眠
谁执行,谁就休眠
void setDaemon(boolean false)
对代码进行加锁
synchronized(锁对象){
//代码
}
用synchronized对方法进行加锁
public [static] synchronized 返回值类型 方法名(){
}
Lock lock = new ReenTrantLock()
lock对象.lock()
lock对象.unlock()
由于锁的嵌套,导致A线程等待B线程持有的锁,而B线程也在等待A线程持有的锁。
一个线程休眠,等待另一个线程唤醒后才会继续执行
void wait()//等待
void notify()//唤醒程序(随机唤醒一个)
oid notifyAll()//唤醒所有程序
调用者是锁对象
创建一个队列,线程只有满足条件才会执行
BlockingQueue:
ArrayBlockingQueue(int capacity)
LinkedBlockingQueue();
put(元素)
take()
NEW:新建,Thread对象刚new,就处于这个状态
RUNNABLE:可执行状态,调用start方法开启线程,就会处于这个状态
BLOCKED:阻塞状态,抢锁没抢到
WAITING:等待状态,它不会抢锁!
TIMED-WAITING:限时等待
TERMANITED:终止或者死亡状态
一个线程从创建到销毁的过程
Executors:
static ExecutorService newCachedThreadPool();
ExecutorService:
submit(Runable r);//添加线程(Runnable接口)
submit(Callable c);//添加线程(Callable接口)
shutdown();//销毁线程
没有空闲线程会创建新的线程
ExecutorService newFixedThreadPool(int nTheads)
public ThreadPoolExecutor(
int corePoolSize, //核心线程数量
int maximumPoolSize, //最大线程数量
long keepAliveTime, //最大空闲时间
TimeUnit unit, //时间单位
BlockingQueue<Runnable> workQueue, //阻塞队列,存储任务
ThreadFactory threadFactory, //线程工厂,用来创建线程
RejectedExecutionHandler handler //拒绝策略
)
参数有:
核心线程数
最大线程数
最大空闲时间
时间单位
阻塞队列
线程工厂
拒绝策略
ThreadPoolExecutor pool = new ThreadPoolExecutor(
2,//核心线程数量
5,//最大线程数量
2,//最大空闲时间
TimeUnit.SECONDS,//时间单位
new ArrayBlockingQueue<>(10),//阻塞队列,存储任务
Executors.defaultThreadFactory(),//线程工厂,用来创建线程
new ThreadPoolExecutor.AbortPolicy()//拒绝策略
);
while(true){
//任务被拒绝,则重复提交任务
try {
pool.submit(new Runnable() {
@Override
public void run() {
System.out.println("Helo");
}
});
break;
} catch (Exception e) {
//任务被拒绝了
//重新提交任务
continue;
}
}
认为被拒绝会报错,重复提交任务,直到任务执行完毕
一个整体,不可分割!不可以被别的线程打断
不具有;
一个count++,count++被编程成.class文件后,对应着有三个class指令,它代表了三个动作;其他线程就可以打断这三个操作;
AtomicInteger();
int get();//获取值
int getAndIncrement();//先获取再自增
int incrementAndGet();//先自增再获取
int addAndGet(int delta);//先添加一个值再获取
int getAndSet(int delta);//先获取再添加一个值
while(true){
1.读取内存的值Value,赋值给oValue: oValue = mValue;
2.对oValue加1,赋值给nValue: nValue = oValue+1;
3.比较 oValue和mValue是否相等
if(oValue == mValue){
把nValue赋值给mValue;
break;跳出循环
}else{
有其他线程把内存值mValue已经篡改了,继续重新循环再做一次
continue;
}
}
旧值-oValue 新值-nValue 内存值-mValue
每个操作表的方法上都加了synchronized。
ConcurrentHashMap值扩容小数组,并且每次只锁表的一小部分,哈希表永远只有16个位置
ConcurrentHashMap存储数据时只锁住一部分;
如果要把一个元素存储到哈希表数组指定索引处:
使用场景:
一个线程任务可能要依赖其他多个线程任务的结果才能继续时。
public CountDownLatch(int count):
public void await():
public void countDown():
使用场景:
在多线程争抢相同资源时进行限流
public Semaphore(int permits)
public void acquire()
public void release()
文章浏览阅读658次。1.SequoiaDB 简介2.整体架构3.数据库存储引擎4.核心特性。_sequoiadb
文章浏览阅读1.7k次,点赞6次,收藏3次。作者 | 程序员客栈来源 | ID:proginnwx根据中国互联网络信息中心(CNNIC)近日发布第 44 次《中国互联网络发展状况统计报告》。截至 2019 年 06 月,中国网民规模为 8.54 亿,较 2018 年底增加 2598 万。网上外卖用户规模达 4.21 亿,较 2018 年底增长 1516 万;网络视频用户规模达 7.59 亿,较 2018 年底增长 3391 万;我..._2020年薪酬数据报告
文章浏览阅读1.3w次,点赞78次,收藏73次。轻舟低代码平台,NASL是其中的关键,也是最大的差异化。回头看Gartner的定义,也有LCAP(低代码平台)和CADP(无代码平台)之分,前者对开发完整性、应用独立性、逻辑完备性、可接入可集成等都有要求,所以说,NASL的实现使得轻舟低代码更符合这一理念。说到框架,大家首先想到肯定是是react,springboot这种被广泛使用的前后端框架,低代码框架本质上跟他们类似,差别在于,低代码框架通常支持从前后端到数据库的全栈模型实现,而且封装程度更高。_网易nasl语言
文章浏览阅读1.2k次。A2B系统的EEPROM自启动如何做,本文来告诉你_a2b技术学习
文章浏览阅读2.2k次。编写程序并编译后出现如上图报错,大致意思为:编译器安装无效,所以编译器无法运行编译器,请检查编译器路径有没有正确配置,并且给出了个修改步骤,最后说设置的路径没有找到编译器文件。。。解决方法:S1:首先我们要确定我们下载安装Code Blocks是带有编译器版本的,就是带有MinGW的版本:下载地址:http://www.codeblocks.org/downloads/26S2:然后给软件指定MinGW的所在路径:菜单栏Settings -> Compil..._codeblocks编译器无效
文章浏览阅读475次。点击上方“Python大本营”,选择“置顶公众号”Python大本营 IT人的职业提升平台来源:pypl编程榜一直以来Python长期霸占编程语言排行榜前三位,其简洁,功能强大的特性..._python好游戏代码
文章浏览阅读1.5k次。webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { try{ if(url.startsWith("baidumap://")){ Intent _error_unsupported_scheme
文章浏览阅读66次。Embed (一)、基本语法: embed src=url 说明:embed可以用来插入各种多媒体,格式可以是 Midi、Wav、AIFF、AU、MP3等等, Netscape及新版的IE 都支持。url为音频或视频文件及其路径,可以是相对路径或绝对路径。 示例:<embed src="your.mid"> (二)、属性设置: 1、自动播放...
文章浏览阅读330次。PHP -- 文件包含、文件上传漏洞PHP -- 文件包含、文件上传漏洞文件包含文件引入漏洞,是由一个动态页面编译时引入另一个文件的操作。文件引入本身是没有问题,它是用于统一页面风格,减少代码冗余的一种技术。但是在特定的场景下就会形成漏洞jsp:include指令和include动作,其中include动作用于引入动态文件php:include(),include_once(),require()..._php文件上传4漏洞
文章浏览阅读406次。SSL 是需要申请证书的,key和PEM文件要放到服务器路径。然后NGINX下要进行443端口和80端口的绑定。server { listen 80; server_name ietaiji.com www.ietaiji.com; root "D:/aaa/WWW/ietaiji"; index index.html_nginx 和 http无法同时启动
文章浏览阅读1.3w次,点赞9次,收藏60次。service与systemctl关系梳理开机启动梳理_linux service
文章浏览阅读194次。在数据中心里,光模块毫不起眼,当我们在高谈阔论各种数据中心高大上技术时,很少提及到光模块。不过,光模块却是数据中心的必需品,哪个数据中心也离不开光模块,而且需要的数量还不少,一块48端口网络设备就需要48个光模块,而一台框式网络设备通常有数百个端口,这些端口如果都使用上就需要数百个光模块,这样算起来数据中心需要的光模块数量是惊人的。数据中心在进行网络投资..._光模块 占 数据中心 成本