class MainActivity : AppCompatActivity() {
private val TAG = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val market = DataMarket()
val pro = Producer(market)
val con = Consumer(market)
pro.start()
con.start()
Handler(Looper.myLooper()!!).postDelayed({
pro.stop()
con.stop()
}, 1000)
}
class Producer(private val market: DataMarket) : Runnable {
private val running = AtomicBoolean(false)
private lateinit var worker: Thread
private var d = 0
fun start() {
worker = Thread(this, "生产者")
worker.start()
}
fun stop() {
running.set(false)
}
override fun run() {
running.set(true)
while (running.get()) {
market.make(++d)
Thread.sleep(Random.nextLong(50))
}
}
}
class Consumer(private val market: DataMarket) : Runnable {
private val running = AtomicBoolean(false)
private lateinit var worker: Thread
fun start() {
worker = Thread(this, "消费者")
worker.start()
}
fun stop() {
running.set(false)
}
override fun run() {
running.set(true)
while (running.get()) {
market.sale()
Thread.sleep(Random.nextLong(50))
}
}
}
open class BaseRunnable(private val threadName: String) : Runnable {
val running = AtomicBoolean(false)
private lateinit var worker: Thread
fun start() {
worker = Thread(this, threadName)
worker.start()
}
fun stop() {
running.set(false)
}
override fun run() {
}
}
class MyRunnable(name: String = Thread.currentThread().name) : BaseRunnable(name) {
override fun run() {
running.set(true)
while (running.get()) {
}
}
}
class ProThread(private val market: DataMarket) : Thread() {
private var d = 0
override fun run() {
while (true) {
market.make(++d)
sleep(Random.nextLong(50))
}
}
}
class ConThread(private val market: DataMarket) : Thread() {
override fun run() {
while (true) {
market.sale()
sleep(Random.nextLong(50))
}
}
}
}
class DataMarket {
private val mList: MutableList<Int> = mutableListOf()
private val lock = ReentrantLock()
private val condition = lock.newCondition()
private val MAX_CAPACITY = 10
fun make(data: Int) {
lock.lock()
try {
while (mList.size >= MAX_CAPACITY) {
Log.d(TAG, "仓库已满")
try {
condition.await()
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
mList.add(data)
Log.d(TAG, "${Thread.currentThread().name} 生产成功: $data")
condition.signalAll()
} finally {
lock.unlock()
}
}
fun sale() {
lock.lock()
try {
while (mList.size <= 0) {
Log.d(TAG, "已全部消费")
try {
condition.await()
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
val value = mList.first()
Log.d(TAG, "${Thread.currentThread().name} 消费成功: $value")
mList.remove(mList.first())
condition.signalAll()
} finally {
lock.unlock()
}
}
}