多线程
Posted zwcnblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程相关的知识,希望对你有一定的参考价值。
一、创建线程
1.1 继承Thread
步骤:1、自定义异常类继承Thread类
2、重写run()方法
3、创建线程对象
4、启动线程:线程对象.start();
1.2 实现Runnable接口(注意也可以是匿名内部类的方式)
步骤:1、自定义类实现Runnable接口
2、重写run();方法
3、创建自定义类对象(注意:这不是一个线程对象,只有继承Thread的子类才是线程类)
4、创建线程,使用Thread(Runnable target)构造器,将自定义类对象作为参数传递。
5、启动线程:线程对象.start();
二、Thread类
2.1 常用构造方法
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target, String name)
2.2 常用方法
static Thread currentThread() :返回当前线程对象
String getName() :返回该线程的名称。
int getPriority(): 返回线程的优先级。
void setPriority(int newPriority) :更改线程的优先级。
Thread.State getState()返回该线程的状态,状态是枚举类。
boolean isDaemon() :测试该线程是否为守护线程。
void setDaemon(boolean on) :将该线程标记为守护线程或用户线程。
void join() :某个线程调用该方法加入到另一个线程中,另一个线程等待该线程执行完毕后再继续执行。
void run() :里面写业务
static void sleep(long millis) :正在执行的线程休眠
void start() :使该线程开始执行,执行run方法
static void yield() :暂停当前正在执行的线程对象,并执行其他线程。
三、线程同步
加锁原则:尽可能缩小加锁的范围,提高程序效率
3.1 同步代码块
synchronize(同步监听对象){
需要被同步的代码
}
注意:监听对象可以是任意的,但是要保证多个线程访问到的是同一个对象。常用当前类的字节码对象。
3.2 同步方法
使用synchronize修饰方法,放在返回值类型前面,不需要写同步监听对象,实例方法默认监听对象是this,静态方法默认监听对象是当前类的字节码对象。
注意:继承的方式的话,建议使用同步代码块,因为this不是同一个对象,虽然通过static修饰方法是可以的,但是这样不好,一般static用于工具类方法。
3.3 锁机制
通过:private final ReentrantLock lock = new ReentrantLock();//创建锁对象
语法:lock.lock(); //加锁
try {
//需要同步的代码
} finally {
//通常释放资源
lock.unlock();//解锁
}
注意:1、这种方式和前面两种方式一样,必须保证锁是同一个对象。(继承方式需要static修饰锁,实现不需要)
四、线程通信
三个方法: 均是Object方法
void wait() :在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
void notify() :唤醒在此对象监视器上等待的单个线程。
void notifyAll():唤醒在此对象监视器上等待的所有线程。
以上是关于多线程的主要内容,如果未能解决你的问题,请参考以下文章