A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© IT人才 初级黑马   /  2018-11-26 14:51  /  790 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程
想要开启多线程 必须先调用  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()方法结束(执行结束, 或内部出现异常), 则进入此状态


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马