博客信息

线程总结

发布时间:『 2019-05-29 23:12』  博客类别:java基础  阅读(692)

线程的创建的知识点

什么是进程?

是一个正在执行中的程序;



什么是线程?

就是进程中的一个独立的控制单元;

一个进程中至少有一个进程。



多线程存在的意义?

能够在同一时间处理更多的事情;

在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时当前线程

的所属分类(消费者或者生产者);




关键字:     Java基础       多线程  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有