JUC Java.util.Concurrent 并发包
子接口
①newFixedThreadPool(规定数量);固定
②newCashedThreadPool;动态增加
线程池中的线程是提前那创建好了,节省创建时间。
线程池中的线程是可重复利用。
线程和任务解耦了。
线程每做完一次任务,回到池中,等待线程池给他分配任务。
创建线程的方式:
方式二:实现Runnable接口
对比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();
// 拷贝 小括号() 写死 右箭头-> 落地 大括号{}
原文:https://www.cnblogs.com/a276665092/p/12056892.html