多线程
想要开启多线程 必须先调用 start()方法 不能调用run()方法
获取当前线程的名称
1.使用Thread类中的方法 getName() 线程对象调用
2.先获取当前正在执行的线程currentThread(),再使用getName()
直接用Thread调用currentThread() 因为他是静态方法
在自定义的MyThread方法中
Thread.currentThread()获取正在执行的方法名字 返回一个 Thread thread
再用thread调用.getName()获取当前线程的名字返回String name
修改名字可以用构造方法 或者 对象名.setName();
C:/Users/Administrator/AppData/Local/YNote/data/qqABF3AFC7E7EB3E0C2825A19D8E6A47E1/d8de002eeaa1443abe57b6114252ac5d/38c115db8e4848c692eb073660f91a1d.jpg
常用静态方法 sleep()
创建多线程的第二种实现方式:
实现Runnable接口(多用这个
)
创建线程的第2种方式:
1. 定义类, 实现Runnable接口
2. 重写 run() 方法, 要执行的代码(任务)
3. 创建Runnable实现类对象 (任务对象)
4. 创建Thread类对象, 在构造方法中传入Runnable实现类对象 (将任务和线程绑定)
5. 通过Thread对象调用 start() 方法启动线程
java.lang.Thread类: 表示线程. 实现了Runnable接口
// 构造方法
Thread Thread(Runnable target): 通过Runnable对象创建Thread对象
Thread Thread(Runnable target, String threadName): 通过Runnable对象创建对象并指定线程名
C:/Users/Administrator/AppData/Local/YNote/data/qqABF3AFC7E7EB3E0C2825A19D8E6A47E1/4260e72fa2b848228075a55ace02942b/a4ca8857f666498aa899762e192377de.jpg
解决线程安全问题 第一种方法 同步代码块
同步代码块: 使用 synchronized 关键字修饰的代码块, 并传入一个当作锁的对象
格式:
synchronized (锁对象) {
// 操作共享数据的代码
}
注意:
锁对象可以是"任意类型的一个对象"
锁对象必须是"被多个线程共享的唯一的"对象
锁对象的作用: 只让一个线程在同步代码块中执行
锁对象, 也称为"同步锁", "对象锁", "对象监视器"
同步的原理:
线程进入同步代码块前, 会"争夺锁对象", "只有一个线程"会抢到锁对象
进入同步代码块的线程, 会"持有锁对象", 并执行同步代码块中的代码
此时同步代码块外的线程, 处于"阻塞"状态, 只能等待
当同步代码块内的线程执行完代码块, 会离开同步代码块, 并"归还锁对象"给同步代码块
等在同步代码块外的其他线程就可以继续争夺锁对象
解决线程安全问题第二种方法 同步方法
public
解决线程安全问题第三种方法 lock锁
lock接口中的方法
void lock() 获得锁
void unlock() 释放锁
java.util.concurrent.locks.Lock接口: JDK 5 新增的Lock接口
// 成员方法
void lock(): 获取锁
void unlock(): 释放锁
java.util.concurrent.locks.ReentrantLock类: Lock的实现类
使用方式:
public class RunnableImpl implements Runnable {
// 成员变量创建锁对象, 该锁对象也要所有线程共享唯一一个
Lock lock = new ReentrantLock(); // 成员变量
@Override
public void run() {
// 加锁
lock.lock();
try {
// 操作共享变量的代码...
} finally {
// 在finally中保证释放锁
lock.unlock();
}
}
}
线程间的通信:
线程的生命周期中, 可以出现有6种状态:
1. "NEW 新建"
线程被创建, 但没有调用 start() 启动
2. "RUNNABLE 可运行"
调用 start()方法后已启动, 但可能正在执行 run() 方法的代码, 也可能正在等待CPU的调度
3. "BLOCKED (锁)阻塞"
线程试图获取锁, 但此时锁被其他线程持有
4. "WAITING 无限等待"
通过锁对象调用无参的 wait() 进入此状态.
等待其他线程通过锁对象执行 notify() 或 notifyAll() 才能结束这个状态
5. "TIMED_WAITING 计时等待"
如通过锁对象调用有参的 wait(long millis) 或 sleep(long millis), 则进入此状态.
直到时间结束之前被其他线程通过锁对象执行 notify()或 notifyAll()唤醒, 或时间结束自动唤醒
6. "TERMINATED 终止"
run()方法结束(执行结束, 或内部出现异常), 则进入此状态
|
|