1. 并发队列

入队:
非阻塞队列:当队列中满了时候,放入数据,数据丢失
阻塞队列:当队列满了的时候,进行等待,什么时候队列中有出队的数据,那么第11个再放进去。
出队:
非阻塞队列:如果现在队列中没有元素,取数据,得到的是null
阻塞队列:等待,什么时候放进去,再取出来。
线程池----阻塞队列
2. 线程池底层原理

3. 线程池的分类
可缓存 newCachedThreadPool()
package com.liqinglin.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
for(int i = 0; i < 100; i++){
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
es.shutdown();
}
}定长 newFixedThreadPool()
package com.liqinglin.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
public static void main(String[] args) {
ExecutorService es = Executors.newFixedThreadPool(3);
for(int i = 0; i < 100; i++){
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
es.shutdown();
}
}定时 newScheduledThreadPool()
package com.liqinglin.test;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadPool {
public static void main(String[] args) {
ScheduledExecutorService ses = Executors.newScheduledThreadPool(3);
for(int i = 0; i < 100; i++){
ses.schedule(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
},3, TimeUnit.SECONDS);
}
ses.shutdown();
}
}单例 newSingleThreadExecutor()
package com.liqinglin.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPool {
public static void main(String[] args) {
ExecutorService es = Executors.newSingleThreadExecutor();
for(int i = 0; i < 100; i++){
es.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
}
es.shutdown();
}
}