juc
juc
✨知识点只说一句话系列
多线程
- 线程 操作 资源类
- 判断 干活通知
- 防止线程唤醒 不能if 只能while
- 唤醒注意标志位 精准通知 精准唤醒
是什么
java.util.concurrent在并发编程中使用的工具类
进程
后台运行的一个程序 操作系统相关
线程
依附于进程 共享进程的资源
并发
几个线程同时抢夺资源
并行
同时做不同的事情就是并行
Synchronized
锁的是整个的资源对象,如果修饰的是静态的方法 锁的就会是.class的模板文件,还有就是要注意锁的对象是不是同一个
101010题目 wait notifyAll
ReentrantLock
相比Synchronized更细腻
private Lock lock = new ReentrantLock();
lock.lock();
condition.await();
lock.unlock();
condition.signalAll();
private Condition condition1 = lock.newCondition();
condition2.signal();
A 5 B10 C15
安全的集合
Set map 自己类推尝试
Vector Collections.synchronizedList copyOnwriteArrayList()
注意:ConcurrentHashMap
注意异常:ConcurrentModificationException
Callable
带返回值
class MyThread implements Callable<Integer> {
FutureTask futureTask = new FutureTask(new MyThread());
new Thread(futureTask,"dddd").start();
System.out.println(futureTask.get());
CountDownLatch
所有线程执行完- 才继续往下走
CountDownLatch countDownLatch = new CountDownLatch(7);
for (int i = 1; i <=7 ; i++) {
new Thread(()->{
System.out.println("go");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
countDownLatch.await();
System.out.println("guan");
CyclicBarrier
所有线程执行完 - 执行方法中
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
System.out.println("手机慢了");
});
for (int i = 0; i < 7; i++) {
int finalI = i;
new Thread(() -> {
try {
System.out.println(finalI);
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}, String.valueOf(i)).start();
}
Semaphore
抢占车位
6个线程 顺序执行
Semaphore semaphore = new Semaphore(1);
for (int i = 0; i < 6; i++) {
int finalI = i;
new Thread(()->{
try {
semaphore.acquire();
System.out.println(finalI+"抢到");
TimeUnit.SECONDS.sleep(3);
System.out.println(finalI+"离开");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release();
}
},String.valueOf(i)).start();
}
ReentrantReadWriteLock
读写分离
class MyCache {
private volatile Map<String, Object> map = new HashMap<>();
private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
public void put(String k, Object v) {
try {
readWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName() + "开始x");
map.put("k", "ddd");
System.out.println(Thread.currentThread().getName() + "结束x");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.writeLock().unlock();
}
}
public void get(String k) {
try {
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName() + "开始d");
map.get(k);
System.out.println(Thread.currentThread().getName() + "结束d");
} catch (Exception e) {
e.printStackTrace();
} finally {
readWriteLock.readLock().unlock();
}
}
}
阻塞队列
不得不阻塞(火车站候车区) 希望被阻塞(海底捞 候客区)
空的时候 取阻塞
满的时候 加阻塞
add remove element 异常
ofter pool peek true false
ofter(time) pool(time) 不可用 阻塞超时退出
put take 不可用 阻塞
插播作用域
基本类型 引用类型 String的问题(修改 会在常量池创建新的)
线程池
ExecutorService executorService = Executors.newFixedThreadPool(5); //指定几个池子
//Executors.newSingleThreadExecutor() 单利
//Executors.newCachedThreadPool() 可扩容 可伸缩
try {
for (int i = 0; i <10 ; i++) {
executorService.execute(()->{
System.out.println("业务" + Thread.currentThread().getName());
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
原理:
7个重要的参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
1:corePoolSize 常驻核心线程数
2:maximumPoolSize 能够容纳的最大线程数 必须大于等于1
3:keepAliveTime 时间单位内 没有新的来 将缩小的核心线程数
4:unit 时间单位
5:workQueue 阻塞队列
6:threadFactory 生产线程工厂 一般默认即可
7:reject defaultHandler 拒绝策略 管控 队列满了拒绝runable的策略
线程池用哪一个
newFixedThreadPool
newSingleThreadExecutor
newCachedThreadPool
哪一个都不用
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, //最大值
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
拒绝策略
AbortPolicy 达到 直接抛出
CallerRunsPolicy 达到 谁调用的找谁 main
DiscardOldestPolicy 抛弃等待最久的
DiscardPolicy 陌陌抛弃 无法处理的 不报错
如何选择最大线程数
CPU密集 核数
IO密集 核数 / 阻尼
System.out.println(Runtime.getRuntime().availableProcessors());
stream计算
Function<String,Integer> fu = new Function<String, Integer>() {
@Override
public Integer apply(String s) {
return 100;
}
};
Predicate<String> predicate = new Predicate<String>() {
@Override
public boolean test(String s) {
return false;
}
};
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
}
};
Supplier<String> supplier =new Supplier<String>() {
@Override
public String get() {
return "ddddd";
}
}
List<Integer> list = Arrays.asList(4,6,7);
list = list.stream().map(t->{return t*2;}).collect(Collectors.toList());
for (Integer integer : list) {
System.out.println(integer);
}
User u1 = new User(11L,"ss0",22L);
User u2 = new User(12L,"ss1",23L);
User u3 = new User(13L,"ss2",24L);
User u4 = new User(14L,"ss3",25L);
User u5 = new User(15L,"ss4",26L);
List<User> list2 = Arrays.asList(u1,u2,u3,u4,u5);
list2.stream().filter(u->{return u.getId()>=13;}).map(user -> {
return user.getName().toUpperCase();
}).sorted((o1,o2)->{
return o2.compareTo(o1);
}).limit(1).forEach(System.out::println);
CompletableFuture
CompletableFuture<Void> ddd = CompletableFuture.runAsync(() -> {
// System.out.println("dddddd");
});
// System.out.println(ddd.get());
CompletableFuture<Integer> ss = CompletableFuture.supplyAsync(()->{
// int i = 10/0;
return 10000;
});
ss.whenComplete((a,b)->{
System.out.println("a:"+a);
System.out.println("b:"+b);
}).exceptionally(f->{
return 444;
});
System.out.println(ss.get());
class MyTask extends RecursiveTask<Integer>{
private static final Integer ADJUST_VALUE = 10;
private int begin;
private int end;
private int result;
public MyTask(int begin, int end) {
this.begin = begin;
this.end = end;
}
@Override
**protected** Integer compute() {
**if**((**end** - **begin**)<=**_ADJUST_VALUE_**){
**for**(**int** i =**begin**;i <= **end**;i++){
**result** = **result** + i;
}
}**else**{
**int** middle = (**begin** + **end**)/2;
MyTask task01 = **new** MyTask(**begin**,middle);
MyTask task02 = **new** MyTask(middle+1,**end**);
task01.fork();
task02.fork();
**result** = task01.join() + task02.join();
}
**return result**;
}
public class ForkJoinDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
MyTask myTask = new MyTask(0,100);
ForkJoinPool forkJoinPool = new ForkJoinPool();
ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
System.out.println(forkJoinTask.get());
forkJoinPool.shutdown();
}
}