美文网首页
两个线程分别按顺序打印26个字母

两个线程分别按顺序打印26个字母

作者: 竖起大拇指 | 来源:发表于2020-09-03 16:25 被阅读0次

考察的主要是通知机制

1.使用对象wait和notify 相互通知

/**
 * Created by maozonghong
 * on 2020/9/3
 */
class LetterThread {

    companion object{
        var char:Char='A'
        private val lock = Object()
        class PrintLetter:Runnable{
            override fun run() {

                while (true){
                    synchronized(lock){
                        //notify并不释放锁,只是告诉调用过wait方法的线程可以去参与获得锁的竞争了,
                        // 但不是马上得到锁,因为锁还在自己手里,还没释放
                        lock.notify()
                        try {
                            Thread.sleep(1000)
                        }catch (e:Exception){
                            e.printStackTrace()
                        }

                        if(char.toInt()<91){
                            println(Thread.currentThread().name+"  "+ char.toString()+"  "+char.toInt())

                            char++

                            try {
                                //释放锁,让其他等待此锁的线程获取
                                lock.wait()
                            }catch (e:Exception){
                                e.printStackTrace()
                            }
                        }
                    }
                }

            }

        }

        @JvmStatic
        fun main(args: Array<String>) {
            var runnable=PrintLetter()
            Thread(runnable).start()
            Thread(runnable).start()
        }
    }
}

2.使用ReentrantLock

var reentrantLock=ReentrantLock(true)

        class LockPrintLetter:Runnable{
            override fun run() {

                while (true){

                    reentrantLock.lock()

                    try {
                        Thread.sleep(1000)

                        if(char.toInt()<91) {
                            println(Thread.currentThread().name + "  " + char.toString() + "  " + char.toInt())
                            char++
                        }
                    }finally {
                        reentrantLock.unlock()
                    }
                }
            }

        }

 @JvmStatic
        fun main(args: Array<String>) {
            var runnable=LockPrintLetter()
            Thread(runnable).start()
            Thread(runnable).start()
        }
    }

相关文章

网友评论

      本文标题:两个线程分别按顺序打印26个字母

      本文链接:https://www.haomeiwen.com/subject/bfcosktx.html