多线程总结

今天学的内容是多线程.多线程目的是为了提高程序处理效率

首先,1.多线程是什么 

进程是一个应用程序(1个进程是一个软件)。

线程是一个进程中的执行场景/执行单元。

一个进程可以启动多个线程。

2.进程和线程的关系

例如:进程可以看做是现实生活中的公司。

线程可以看做是公司当中的某个员工。

线程A和线程B,堆内存和方法区内存共享。
但是栈内存独立,一个线程一个栈。

3.使用了多线程机制之后,main方法结束,有可能程序也不会结束。因为main方法结束只是主线程结束了,主栈空了,其它的栈(线程)可能还在压栈弹栈。

4.线程的生命周期

<1>新建状态

<2>.就绪状态

<3>运行状态

<4>阻塞状态

<5>死亡状态

å¨è¿éæå¥å¾çæè¿°

4.实现线程的方式

1>.编写一个类直接继承java.lang.Thread,重写run方法。启动线程,调用线程对象的start()方法就行

2>.编写一个类,实现java.lang.Runnable,重写run方法。

这种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承其他的类,更灵活。

3>.使用匿名内部类

5.java获取修改线程对象的名字

获取线程对象的名字:String name = 线程对象.getName();

修改线程对象的名字:线程对象.setName("线程名字");

当线程没有设置名字的时候,默认的名字规律如下:
Thread-0;
Thread-1;
Thread-2…

6.java线程中sleep方法

static void sleep(long mills)

作用:让当前线程进入休眠,进入“阻塞”状态,放弃占有CPU时间片,让给其他线程使用

7.终止线程睡眠

sleep睡眠太久了,如果希望半道上醒来,可以使用interrupt()方法
注意:这个不是终断线程的执行,是终止线程的睡眠

强行终止线程

stop()方法,有一个很大的缺点:容易丢失数据。因为这种方式是直接将线程杀死了。
线程没有保存的数据将会丢失。不建议使用。应该合理的终止线程,打一个boolean标记

8.线程调度,优先级,让位,合并

  • 抢占式调度模型:
    哪个线程的优先级比较高,抢到的CPU时间片的概率就高一些/多一些。
    java采用的就是抢占式调度模型。

  • 实例方法:
    void setpriority (int newPriority):设置线程的优先级
    int getPriority():获取线程优先级
    最低优先级1
    默认优先级是5
    最高优先级10

  • 静态方法:
    static void yield():让位方法:暂停当前正在执行的线程对象,并执行其他线程
    yield()方法不是阻塞方法。让当前线程让位,让给其它线程使用。
    yield()方法的执行会让当前线程从**“运行状态”回到“就绪状态”**。
    注意:在回到就绪之后,有可能还会再次抢到CPU

  • void join() :合并线程

  • 让位:值当前的线程暂停,回到就绪状态,让给其他线程。
    静态方法:Thread.yield();

  • 线程合并

    线程的合并的含义就是将几个并行线程的线程合并为1个单线程执行。应用场景应该是一个线程必须等待另一个线程执行完毕才能使用join方法。

8.synchronized的三种应用方式
synchronized关键字最主要有以下3种应用方式

修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

9.Java三大变量的线程安全

  • 实例变量:在堆中。

  • 静态变量:在方法区。

  • 局部变量:在栈中。

 10.死锁

11.守护线程概述
Java语言中线程分为两大类:

一类是:用户线程
一类是:守护线程(后台线程)
其中具有代表性的就是:垃圾回收线程(守护线程)、主线程main(用户线程)

守护线程的特点:
一般守护线程是一个死循环,所有的用户只要结束,守护线程自动结束。

守护线程用在什么地方呢?
每天00:00的时候系统数据自动备份。这个需要使用到定时器,并且我们可以将定时器设置为守护线程。一直在那里看着,每到00:00的时候就备份一次。所有的用户线程如果结束了,守护线程自动退出,没有必要进行数据备份了。

12.定时器的作用:
间隔特定的时间,执行特定的程序。

例如每周要进行银行账户的总账操作。
每天要进行数据的备份操作。

在实际的开发中,每隔多久执行一-段特定的程序,这种需求是很常见的,
那么在java中其实可以采用多种方式实现:

可以使用sleep方法,睡眠,设置睡眠时间,没到这个时间点醒来,执行任务。这种方式是最原始的定时器。(比较low)
在java的类库中已经写好了一个定时器: java. util.Timer,可以直接拿来用。不过,这种方式在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的。
在实际的开发中,目前使用较多的是Spring框架中提供的springTask框架,
这个框架只要进行简单的配置,就可以完成定时器的任务。

13.生产者和消费者模式。

表示:唤醒正在o对象上等待的线程。

还有一个notifyAll()方法:唤醒o对象上处于等待的所有下线程

å¨è¿éæå¥å¾çæè¿°

 

 14.什么是生产者和消费者模式?

生产线程负责生产,消费线程负责消费。
生产线程和消费线程要达到均衡。
这是一种特殊的业务需求,在这种特殊的情况下需要使用wait方法和notify方法。

wait和notify方法不是线程对象的方法,是普通java对象都有的方法。
wait方法和notify方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。
wait方法作用:o. wait()让正在o对象上活动的线程t进入等待状态,并且释放掉t线程之前占有的o对象的锁。
notify方法作用:o.notify()让正在o对象上等待的线程唤醒,只是通知,不会释放o对象上之前占有的锁。
 

  • 第一:wait和notify方法不是线程对象的方法,是java中任何一个java对象都有的方法,因为这两个方式是Object类中自带的。
    wait方法和notify方法不是通过线程对象调用的

  • 第二:wait方法的作用?表示:让正在o对象上活动的线程进入等待状态,无限期等待,直到被唤醒为止。o.wait();方法的调用,会让“当前线程(正在o对象上活动的线程)”进入等待状态。

  • 第三:notify()方法的作用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让火车在天上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值