线程的创建的知识点
什么是进程?
是一个正在执行中的程序;
什么是线程?
就是进程中的一个独立的控制单元;
一个进程中至少有一个进程。
多线程存在的意义?
能够在同一时间处理更多的事情;
在Java中,Jvm中主线程与垃圾回收机制就是多线程应用的一个具体体现
主线程不断的在堆内存中创建对象,垃圾回收机制会负责清理不必要的垃圾;
线程的创建方式?
继承Thread类或者实现Runnable接口,实现run方法
线程创建的实现方式和继承方式有什么区别呢?
实现方式好处:避免了单继承的局限性;
在定义线程时,建议使用实现方式;
为什么要覆盖run方法?
覆写run方法的目的就是:将自定义代码存储在run方法,让线程运行;
start与run方法的特点?
Start方法调用:开启线程并执行该线程的run方法;如果有多个线程,那么
Run方法调用:仅仅是对象调用方法,而线程创建了,并未运行;
线程的几种运行状态及特点?
被创建状态:实例化了一个线程对象
运行状态:正在执行代码块的线程
冻结状态:不具备cpu的执行资格
临时状态:对于被调用了start方法的线程而言,并非直接就进入运行状态,
该线程仅仅只具备cpu的执行资格,而这是该线程就处于临时态;
而对于处于冻结状态的线程,被唤醒后也仅仅代表它具备了cpu执行资格;
而不代表它马上就能操作共享数据,这时它也处于临时态
消亡状态:线程结束,run方法结束
多线程安全问题
多线程安全问题的产生?
多个线程操作同一个共享数据,当多线程操作到耗时较长的代码时,而这是线程的状态处于
临时状态,那么这时就会发生并发现象;
如何解决多线程的安全问题?
两种方案:
第一种给方法加上synchronized关键字,给该方法定义成同步函数;
这种方案的好处在于,编码十分的便捷;坏处在于性能相对较低;
第二种给方法中的操作共享数据的代码块加锁,形成同步代码块;
同步函数上的锁是什么?
同步函数的锁是this;
静态同步函数的锁是Class对象;
什么是死锁?
操作共享数据的同步代码块或者同步函数中有两把锁,
而这两把锁一个线程拿一个,那么造成了这两个线程
都在等待第二把锁来执行后续代码的现象,两个线程都处于
等待状态,这就属于死锁
多线程中的通信
为什么需要多线程间进行通信?
这里需要明白两个概念,生产者以及消费者。
顾名思义生产者是用来生产资源的,消费者是来消费资源的;
资源如果被多线程操作的话,那么就会有不正常的现象发生;
如生产出一个资源,但是消费了两次;
或者生产了两个资源,而被消费了一次;
而正常的现象应该是,每生产出一个资源,就被消费一个;
那么消费者怎么知道生产者生产了一个资源呢?
这是就需要负责消费的线程与负责生产的线程进行通信。
针对于线程,jdk1.5做了哪些升级?
拿生产者消费者来说,jdk1.5之前,为了保证生产一个消费一个的原则,
要用到线程等待与唤醒机制,其中有多个生产者消费者的话,那么需要
用到notifyAll(),这个方法不好之处在于,它不仅仅唤醒的是对方线程,
还会唤醒己方线程;这样带来的后果是,被唤醒己方线程会和被唤醒
的对方线程抢夺cpu的执行权;cpu执行权的竞争就更大;
如果,在生产者的线程(己方线程)中可以做到只唤醒消费者所在线程
(对方线程),那么性能可以做进一步的提升;
而jdk1.5针对这一点就做了改进;
从用法上来看:
就是将synchronized换成了java.util.concurrent.locks.Lock类实例;
将原有的wait、notify、notifyAll换成了java.util.concurrent.locks.Condition
中的await、signal、signalAll,调用wait的是当前线程,而调用await时当前线程
的所属分类(消费者或者生产者);
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有