美文网首页
两个线程分别按顺序打印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