Java多线程
来源:互联网 发布:杭州网络策划宣盟网络 编辑:程序博客网 时间:2024/05/21 17:24
1. 线程与进程的区别
一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源。
2. 线程的创建
有两种创建线程的方法:一是实现Runnable接口,然后将它传递给Thread的构造函数,创建一个Thread对象;二是直接继承Thread类。
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。
3. 线程的生命周期
新建(new Thread)、就绪(runnable)、运行(running)、死亡(dead)和堵塞(blocked:包含:sleep,wait,同步等待)五种
4. 线程的wait(),notify(),notifyAll,必须在同步块或者同步方法中。且这三个方法是属于object对象里。
因为这三个方法是需要有当前对象的锁,所以必须在同步块或者同步方法中,以便操作时有锁。
Java的每个对象中都有一个锁(monitor,也可以成为监视器) 并且wait(),notify()等方法用于等待对象的锁或者通知其他线程对象的监视器可用。
5. sleep(),yield(),属于Thread的静态方法。
yield()该方法与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
6. 创建守护线程
使用Thread类的setDaemon(true)方法可以将线程设置为守护线程,需要注意的是,需要在调用start()方法前调用这个方法,否则会抛出IllegalThreadStateException异常。
7. ThreadLocal 描述
ThreadLocal用于创建线程的本地变量,我们知道一个对象的所有线程会共享它的全局变量,所以这些变量不是线程安全的,我们可以使用同步技术。但是当我们不想使用同步的时候,我们可以选择ThreadLocal变量。
归纳了两点:
1。每个线程中都有一个自己的ThreadLocalMap类对象,可以将线程自己的对象保持到其中,各管各的,线程可以正确的访问到自己的对象。
2。将一个共用的ThreadLocal静态实例作为key,将不同对象的引用保存到不同线程的ThreadLocalMap中,然后在线程执行的各处通过这个静态ThreadLocal实例的get()方法取得自己线程保存的那个对象,避免了将这个对象作为参数传递的麻烦。
我的理解:例如数据库连接,复制给每一个线程一个实例,然后每个线程可以操作。如果共享一个,会涉及到数据安全,传入的参数混乱,等待等问题。
例如Spring事物,在执行时AOP时不能传叁,那么通过本地变量,可以获取相应数据对象。
- 【Java多线程】多线程死锁
- Java 多线程
- java 多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA 多线程
- Java多线程
- java多线程
- JAVA 多线程
- Java 多线程
- Java 多线程
- java多线程
- Java 多线程
- Java多线程
- java 多线程
- svn问题集锦
- mysql查询上月的信息
- yum报错: You could try using --skip-broken to work around the problem
- ionic2 app本地更新----来自第29次的欣喜
- ActiveMQ简单的HelloWorld实例
- Java多线程
- 2017第九届中国国际物联网博览会(春季展)会刊(参展商名录)
- 三分钟理解什么是面向对象
- idea terminal 修改为git bash 不支持中文 问题解决
- [Android] ScrollView can host only one direct child
- 堆栈和队列
- 华为机试1---21题
- VS 2012中如何重新安装HlpViewer的问题
- LeetCode 栈和队列的互换