020_JUC
JUC Java.util.Concurrent 并发包
池的顶级接口 Executor
子接口 ExecutorService
工具类 Executors(Collections、Arrays ...都是工具类)
①newFixedThreadPool(规定数量);固定
②newCashedThreadPool;动态增加
③newSingleThreadPool;只有一个
线程池中的线程是提前那创建好了,节省创建时间。
线程池中的线程是可重复利用。
线程和任务解耦了。
线程每做完一次任务,回到池中,等待线程池给他分配任务。
创建线程的方式:
方式一:继承 Thread
方式二:实现Runnable接口
方式三:实现Callable接口
对比Runnable与Callable的区别
| Runnable | Callable |
| 抽象方法是run | 抽象方法是call |
| run方法没有返回值 | call方法有返回值(可以指定) |
| run方法没有声明异常 | call方法声明了异常 |
Callable对象是在线程池对象的submit时执行
具体使用Callable时,接收返回值是future对象
获取返回值时,是Future对象的get()方法获取
| 并行 | 并发 |
|
多个线程同一时刻 同时进行 |
多个线程同一间隔 "同时进行" |
Lock
ReentrantLock (实现类,这是可重入锁);
创建可重入锁:
Lock lock = new ReentrantLock();
// 在需要加锁的地方
lock.lock();
// 解锁
try{}
finally{
lock.unlock();
} --------------------华丽丽的线--------------------------
synchronized(锁) 通信 锁.wait() 进入等待队列 锁.notifyAll() 通知
相对应的 *******************
lock *
*
通信 await() *
*
signal() *
// 这个是错误的吧! *
创建线程的方式:
方式一:
extends Thread{
重写run(){....}
}
// Thread.currentThread().getname() 获取姓名
启动:
直接在main中new然后 .start();
匿名内部类
new Thread("线程二"){
run(){...}
}.start();
--------------------华丽丽的线--------------------------
方式二:
implements Runnable{
重写run(){...}
}
new 然后new Thread(new名字)
t.start()
匿名内部类
new Thread(new Runnable{// 这没有 ")"
run(){...}
}).start();// 在这呢")"
--------------------华丽丽的线-------------------------- 方式三:
实现Callable接口
implements Callable<>{
重写call(){}
public Object call(){... return null}
}
启动:
ExecutorService pool= Executors.newFixedThreadPool(3);//固定的线程数
new 上边对象;
// 通过线程池对象,提交任务分配给线程对象执行
pool.submit(new 对象);
// 匿名内部类
pool.submit(new Callable(){
重写call(){}
public Object call(){... return null}
});
--------------------华丽丽的线-------------------------- 方式四:
// JDK8之后 lambda 表达式 创建多线程
// 针对接口只有一个 抽象方法 才可用
new Thread(()->{
直接写代码块
}).start();
// 拷贝 小括号() 写死 右箭头-> 落地 大括号{}
020_JUC的更多相关文章
随机推荐
- 使用js在页面上新建文件夹
使用js在页面上新建文件夹 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- eclipse 集成 STS 插件
eclipse 集成 STS 插件 想新建一个 Spring Boot 工程,发现没有,如图:(展示的是集成之后的) eclipse 要和 sts 版本对应的,进入http://spring.io/t ...
- c#网络通信框架networkcomms内核解析之一 消息传送
networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输 ...
- linux SMbus错误
针对piix4_smbus ****host smbus controller not enabled的解决方法 查看文件并用超级权限修改内容 在末尾加入blacklist i2c——piix4 重启 ...
- Java中创建泛型数组
Java中创建泛型数组 使用泛型时,我想很多人肯定尝试过如下的代码,去创建一个泛型数组 T[] array = new T[]; 当我们写出这样的代码时编译器会报Cannot create a gen ...
- upc组队赛1 小C的数学问题【单调栈】(POJ2796)
小C的数学问题 题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n ...
- Pandas数据处理 学习
pandas是在numpy的基础上建立的新程序库,提供了一种高效的DataFrame数据结构. DataFrame本质上是一种带行标签和列标签.支持相同数据类型和缺失值的多维数组. 先看版本信息: p ...
- centos7 编译打包bcache-tools
centos7 build bcache-tools 获取源码 centos 本身不提供bcache-tools的rpm,所以需要自己build. 从fedora下载源码,也可以从github社区下载 ...
- 错误ORA-01110,在已删除数据文件情况下如何删除表空间
如果先行删除了数据文件,再删除表空间,drop tablespace 会出现如下错误: ORA-01116: error in opening database file 89 ORA-01110: ...
- servlet的ServletContext接口
ServletContext Servlet 上下文 每个web工程都只有一个ServletContext对象,也就是不管在哪个servlet里面,获取到的这个ServletContext对象都是同一 ...