一、知识点概括
1.异常
2.线程
二、总结:
I.线程与进程:线程属于进程,是进程的一个执行单元,负责程序的执行
II.线程的好处:效率高,多线程之间互不影响
如:
单核心线程cpu:
1)cpu再在多个线程之间进行切换,轮流执行多个线程
2)效率低
3)切换速度块(1/n毫秒)
4核心8线程:
1)有8个线程可同时执行8个线程
2)8个线程在多个任务间进行切换
3)速度是单线程cpu的8倍
III.主线程:执行主方法(main)的线程
单线程程序:Java程序中只有一个线程,执行从main方法开始,从上到下依次执行
多线程程序:
1)通过创建Thread子类实现(java.util.Thread:是描述线程的类)
结果是多个线程并发执行,主线程和其他创建的新线程(执行run方法)
2)通过实现Runnable接口(java.lang.Runnable:类必须定义一个无参run()方法)
IV.实现Runnable接口创建多线程的好处:
1)避免了单继承的局限性:
一个类只能继承一个类,而实现Runnable接口,还可以继承其他的类,实现其他接口
2)增强了程序的扩展性,降低了程序的耦合性
把设置线程任务和启动新线程进行分离
V.等待唤醒案例:
创建一个消费者线程:告知生产者空缺商品的种类和数量,然后调用wait方法
创建一个生产者线程:生产商品,然后唤醒消费者
//发现这样写很是简洁,但是刚开始学习还是一步一步分开写比较好,这样写还是熟练之后再说吧,不过学习一下还是蛮好的
public class Test{
public static void main(String[] args){
//创建锁对象,保证唯一
Object obj = new Object();
//创建一个消费者线程
new Thread(){
@Override
public void run(){
//一直等待
while(true){
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
syncharonized (obj){
System.out.println("告知老板要的商品的种类和数量");
//调用wait方法
try{
obj.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("商品补齐,可以购买了!");
System.out.println("--------------");
}
}
}
}.start();
//创建一个生产者线程
new Thread(){
@Override
public void run(){
//一直生产商品
while(true){
try{
Thread.sleep(2000);//花2秒生产
}catch(InterruptedException e);
e.printStackTrace();
}
//保证等待和唤醒只能有一个在执行,需要使用同步技术
syncharonized (obj){
System.out.println("生产完成,唤醒消费者");
//调用notify方法
obj.notify();
}
}
}.start();
}
VI.线程池:
即容纳多个线程的容器,里面的线程可以反复使用,省去了频繁创建新线程的麻烦,解决了资源
线程池(容器)--> 集合(ArrayList,HashSet,LinkedList<Thread>,HashMap)
合理利用线程池的好处:
1)降低资源消耗
2)提高响应速度
3)提高线程的可管理性