就以alibaba的筆試題舉例吧。
題目大概的意思如下:
有乙個籃子,最多容納5個蘋果。有人一直往裡放蘋果。有人一直去蘋果。寫出實現。
ali要求不能用concurrent包裡面的東西,所以只能用最簡單的notify和wait。
如果可以用concurrent包裡面的東西,還可以用blockingqueue和signal、await。
下面實現三種方式:
method1. notigyall()/notify()/wait
public class basket catch (exception e)
} this.size++;
system.out.println(">> 當前籃子內蘋果數"+size);
notifyall(); }
if(size<=0) catch (exception e)
} this.size--;
system.out.println("<< 當前籃子內蘋果數"+size);
notifyall(); }
public synchronized int getsize()
}
public class get implements runnable
public void run() }
}
public class put implements runnable
public void run(
// todo auto-generated method stub
while(!thread.interrupted())
}}
public class test
}
注意,我在測試類裡面用了concurrent的executor,測試類無所謂了。
mtthod2>blockingqueue
public class basket
try catch (interruptedexception e) }
//從籃子取出
system.out.println("<< 當前籃子數量 "+list.size());
if(list.size()<=0)
try catch (interruptedexception e)
}}
public class get implements runnable
public void run()
}}
public class put implements runnable
public void run()
}}
public class test
}
使用blockingqueue的時候,注意一下api就好了。注意 是 put 和 take 函式。
method3.signal、await
public class basket
this.size++;
condition.signalall();
} catch (exception e) finally
}lock.lock();
try
this.size--;
condition.signalall();
} catch (exception e) finally
} public synchronized int getsize()
}
public class get implements runnable
public void run() }
}
public class put implements runnable
public void run()
}}
public class test
}
根據demo可以明顯看出:signal、await是與lock配合用的。而wait、notify是與synchonized配合用的。因此前者擁有更好的靈活性。
多執行緒 生產者消費者
這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...
Linux多執行緒 生產者消費者
生產者消費者問題 這是乙個非常經典的多執行緒題目,題目大意如下 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,所有生產者和消費者都是非同步...
多執行緒 生產者和消費者
生產者 消費者問題 生產者向產品區里放產品,當產品區里滿了,需要等待 消費者從產品區里取產品消耗,當產品區里空了,需要等待。public class producerandconsumer 消費者 static class consumer implements runnable catch int...