多线程

1.线程

1.1 Thread

    1.1.1使用步骤

   (1) 线程继承Thread类

   (2) 重写start方法,将运行的代码写入start方法中

   (3) 创建线程对象→对象.start()

    1.2.1 方法

    (1)getname 返回此线程的名称

    (2)getId 返回此线程的标识符

    (3)getPriority/setPriority getset优先级

    (4)sleep():休眠(毫秒)

    (5)setDaemon():标记为守护线程

    (6)interrupt() 中断标记

    1.2.2 构造器

    (1) Thread(ThreadObject,name) 

1.2 Runnable接口

    1.2.1使用步骤

    (1) 线程实现Runnable接口

    (2) 重写start方法,将运行的代码写入start方法中

    (3) 创建线程对象→创建线程,并为其分配一个任务

    (4) 执行线程(start())

    1.2.2 优势

    (1) 通过创建人物,然后给线程分配的方式来实现的多线程,更适合多个县城同时执行

    (2) 可以避免单继承带来的局限性

    (3) 任务与线程本身是分离的,提高了程序的健壮性

    (4) 后续学习的线程池技术,只接受Runnable类型的任务,而不接受Thread类型的线程

1.3 Callable

    1.3.1 使用步骤

    (1)线程实现Callable接口

    (2)重写call方法

    (3)创建FuturaTask对象,并传入编写的Callable类对象

    (4)通过Thread,启动线程

    1.3.2 方法

    (1)get():    如果需要等待计算完成,然后检索其结果

    (2)get(long timeout,TimeUnit unit):    如果需要,最多等待计算完成的给定时间,然后检索其结果(如果可用)

    (3)isDone():    判断线程是否完成

    (4)cancel():     结束线程   

 1.3.3 特点

        可以通过get方法来获取返回值。

2. 守护线程

    概念

        (1)线程:分为守护线程和用户线程

        (2)用户线程:当一个进程不包含任何的存活的用户线程时,进行结束

        (3) 守护用户线程的,当最后一个用户线程结束时,所有守护线程自动死亡

3.同步锁

    3.1隐式锁

        3.1.1同步代码块

        (1)方式:对需要加锁的代码用synchronized(锁对象){}修饰

        (2)锁:可以是任意对象,需要所有线程共用同一个。

        3.1.2同步方法

        (1)方式:对需要加锁的方法用synchronized修饰

        (2)锁:当同步方法是非静态时,调用对象就是锁。当同步方法是静态时,调用的方法本身就是所。

        eg.当多个同步代码块以及同步方法共用同一把锁,只要有一个代码块或方法在进行,其他所有代码块和同步方法都不能进行。

    3.2显式锁  

        (1)方式:创建显式锁对象:private Lock lock = new ReetrantLock(fair:true);

                            在代码前关锁:  lock.lock();

                            在代码后开锁:  lock.unlock();

        (2)锁:    Lock对象

        (3)公平锁和非公平锁:当fair的值为true时,为公平锁,反之则为非公平锁。公平锁即排队争锁(顺序),非公平锁则为竞争争锁(随机)。

    3.3死锁

        (1)在两个锁同时运行的时候,容易产生死锁

        (2)解决方式:尽量避免两个被锁的方法或代码同时被使用。

4.多线程通信方法

        (1)休眠:wait()        导致当前线程等待它被唤醒,通常是 通知或 中断

        (2)唤醒:notify()      唤醒正在此对象监视器上等待的单个线程。

5.线程的状态

    New(尚未启动)→Runnable(执行)→Blocked(阻塞或等待)→Waiting/TimeWaiting(等待/定是等待)→ Terminated(结束状态)

6.线程池

    6.1缓存线程池

        使用步骤

        1.创建缓存线程池对象→ExecutorService service = Executors.newCachedThreadPool()

        2.用execute方法传入线程对象→service.execute(Runnable class)

    6.2定长线程池

         1.创建定长线程池对象→ExecutorService service = Executors.newFixedThreadPool(2)

         2.用execute方法传入线程对象→service.execute(Runnable class)

    6.3单线程线程池

        1.创建定长线程池对象→ExecutorService service = Executors.newSingleThreadExecutor()

        2.用execute方法传入线程对象→service.execute(Runnable class)

    6.4周期定长线程池

        1.创建定长线程池对象→ScheduledExecutorService service = Executors.newScheduledThreadPool(定时执行的任务)

        2.用schedule方法传入线程对象→service.execute(Runnable class)

        3.在线程对象中给定delay参数(时长数字)以及TimeUnit参数(时长单位)

7.Lambda表达式

    为了简化线程代码,提出Lambda表达式的概念,比起传统线程的代码冗余,Lambda表达式更加简便

    Lambda表达式:new Thread((参数)->方法).start

    传统方法:new Thread(new Runnable(){ public void run(){方法}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值