创建线程池的四种方法
//1.创建一个单线程的线程池
ExecutorService es = Executors.newSingleThreadExecutor();;
//2.创建一个固定大小的线程池
ExecutorService es = Executors.newFixedThreadPool(2);
//3.创建一个可缓存的线程池,如果线程池的大小超过了处理任务所需要的线程,那么机会回收部分空闲的线程,当任务数增加时,次线程池又可以智能的添加新线程来处理任务。此线程不会对线程池大小做限制,线程池大小完全依赖于操作系统能够创建的最大线程大小。
ExecutorService es = Executors.newCachedThreadPool();
//4.创建一个大小无限的线程池
ExecutorService es = Executors.new ScheduledThreadPool(3);
es.execute();1-3可用
es.shutdown();
生产者和消费者案例
sleep和wait的区别**
- sleep:让线程进入休眠状态,让出CPU的时间片,不是放对象监视器的所有权
wait:让线程进入等待状态,让出CPU的时间片,并释放对象监视器的所有权,等待其他线程通过notify方法来唤醒
public class ProducterCustomer{
public static void main(String[] args){
Food food = new Food();
Producter p = new Producter(food);
Customer c = new Customer(food);
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
//消费者
class Customer implement Runnable{
private Food food;
public Producter(Food food){
this.food = food;
}
public void run(){
for(int i =0;i<20;i++){
}
}
}
//生产者
class Producter implement Runnable{
private Food food;
public Producter(Food food){
this.food = food;
}
public void run(){
for(int i =0;i<20;i++){
if(i%2==0){
food.set("土豆丝","酸");
}else{
food.set("红绕肉","甜");
}
}
}
}
class Food{
private String name;
private String desc;
private boolean flag = true;//表示生产,false表示消费
//生产产品
public synchronized void set(String name,String desc){
if(!flag){//不能生产
this.wait();//抛异常,等待线程进入等待状态,释放监视器的所有权
}
this.setName(name);
try{
Thread.sleep(1000);
}catch(Exception e){
e.PrintStackTrack();
}
this.setDesc;
flag = false;
this.notify();//唤醒等待的线程(随机的)
}
//消费产品
public synchronized void get(){
if(flag){//不能消费
this.wait();//抛异常
}
try{
Thread.sleep(1000);
}catch(Exception e){
e.PrintStackTrack();
}
System.out.println(this.getName()+"->"+this.getDesc());
flag = true;
this.notify();
}
public Food(){
}
生成get和set方法
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getDesc(){
return desc;
}
public void setName(String desc){
this.desc = desc;
}
toString方法
public String toString(){
return "Food{"+
"name='"+name+'\''+
"desc='"+desc+'\''+
'}';
}
}