【JavaSE】Java中多线程基本知识

来源:互联网 发布:淘宝宝贝链接复制不了 编辑:程序博客网 时间:2024/06/11 09:59
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动。(通俗的说,一个打开的程序)
线程:进程的一个实体,CPU调度分配的基本单位
进程与线程的区别:一个程序至少有一个进程,一个进程至少有一个线程
多线程存在意义:允许多线程冰法,提高程序运行效率
注意:某一瞬间,只有一个线程在CPU上执行
线程的创建方式:new Thread().start()
创建一个线程:Thread类
new Thread()创建一个线程对象
定义一个类继承Threadlei ,子类具有了线程功能
创建Thread类的子类对象,也可以创建一个线程

线程的启用
Thread类定义了start方法,用于启动当前线程
在启用一个线程时,虚拟机会自动调用对象的run()方法
其他方法:
sleep 使线程进入睡眠状态,要指定唤醒时间,会抛出异常
setDaemon ture 将当前进程置为一个后台进程
join 合并线程,会抛异常。加进来的执行,被加的停掉
currentThread 获得当前运行的线程
setName 给线程起名

程序只要有一个非后台(守护)的线程在运行,就不会结束

创建线程方式二
实现Runnable接口
子类覆盖接口中的run方法
通过Tread实例创建线程,并将实现了Runnable接口的子类对象作为参数传递给Thread类的构造函数
Thread类对象调用start方法开启线程
Thread的异常只能抓,因为父类没有抛出这样的异常。子类不能抛出比父类更多类型的异常

线程安全问题
出现的原因:多个线程访问出现延迟,线程的随机性
解决方式:同步
synchronized(lock){ }
每个对象都可以作为同步的锁,对象都有一个锁旗标(标志位,0或1)
函数可以直接加synchronized编程同步函数
同步函数用的锁:this对象

需要同步的多段代码要用同一把锁(同一个对象)

死锁:两个对象互相要锁的情况

同步的特点:
同步的前提,需要两个及异常的线程
多个线程使用同一个锁
同步的弊端:每个线程都回去判断同步上的锁,耗费资源,降低运行效率

线程间的通信
两个线程可以互相通信,一个线程可以通过wait方法等待,cpu会让给别的线程。等待的线程需要其他线程调用notify()方法唤醒。notify只能用在唤醒在调用方法的对象上等待的线程,只能在锁上等,不同步即不能操作。为了防止虚假唤醒,wait()应放在循环中。

Lock接口——java.util.concurrent.locks
ReentrantLock
condition(为同一个锁提供不同的wait条件)
await——wait,signal——notify
condition最好也放在循环中,因为condition也会出现虚假唤醒
0 0
原创粉丝点击