缺少更多功能,如更多执行,定期执行,线程中断
线程池中的状态:
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@Slf4j
public class ThreadPoolExample {
public static void main(String[] args) {
// ExecutorService executorService= Executors.newCachedThreadPool();
// ExecutorService executorService=Executors.newSingleThreadExecutor();
//ExecutorService executorService=Executors.newFixedThreadPool(3);
ExecutorService executorService=Executors.newScheduledThreadPool(3);
executorService.schedule(new Runnable(){
@Override
public void run(){
log.warn("schedule run");
}
},3, TimeUnit.SECONDS);
//延迟一秒每隔一秒执行
executorService.scheduleAtFixedRate(new Runnable(){
@Override
public void run(){
log.warn("schedule run");
}
},1,3,TimeUnit.SECONDS);
Timer timer=new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
log.warn("schedule run");
}
},new Date(),5*1000);
// for(int i=0;i<10;i++){
// final int index=i;
// executorService.execute(new Runnable() {
// @Override
// public void run() {
// log.info("task:{}",index);
// }
// });
// }
executorService.shutdown();
}
}
死锁案例:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class DeadLock implements Runnable {
public int flag=1;
private static Object o1=new Object(),o2=new Object();
@Override
public void run(){
log.info("flag:",flag);
if(flag==1){
synchronized (o1){
try {
Thread.sleep(500);
}catch (Exception e){
e.printStackTrace();
}
synchronized (o2){
log.info("1");
}
}
}
if(flag==0){
synchronized (o2){
try {
Thread.sleep(500);
}catch (Exception e){
e.printStackTrace();
}
synchronized (o1){
log.info("0");
}
}
}
}
public static void main(String[] args) {
DeadLock td1=new DeadLock();
DeadLock td2=new DeadLock();
td1.flag=1;
td2.flag=0;
new Thread(td1).start();
new Thread(td2).start();
}
}
多线程并发的实践:
1.使用本地变量
2.使用不可变类
3.最小化锁的作用域范围
4.使用线程池的Executor,而不是直接new Thread执行
5.宁可使用同步,也不使用线程的wait和notify
6.使用BlockingQueue实现生产消费模式
7.使用并发集合不是加了锁的同步集合
8.使用Semaphore创建有界的访问
9.宁可使用同步代码块,也不使用同步的方法
10避免使用静态变量
来源:oschina
链接:https://my.oschina.net/u/4345031/blog/4169980