Java 多线程

[TOC]

多线程

进程和线程

进程: 正在执行的程序

线程: 一条独立的执行路径

一个进程可以只有一条线程,也可以有多条线程

为什么要开启多线程?

1.执行某些耗时任务

2.希望某些程序看起来像同时执行

3.希望完成某个特定的子任务

4.防止线程阻塞

开启多线程是提高了效率吗?

不是,反而降低执行效率,但是提高了cpu的使用率

合理利用CPU的使用率

Java中开启了几个线程?

至少有两个

1.主线程

2.垃圾回收线程

多线程: 具有完成特定功能的执行路径,是CPU最先执行单位

CPU在某个时间刻度上只能够执行一条线程的一条原子性语句

int a = 1; 原子性

a ++; 不是

a.将a的值读取出来

b.将a的值+1

c.重新将新值赋值给a

System.out.println(a);

CPU的执行原理

1.真实环境下,CPU能够同时执行多个程序,本质只是在同一个时间刻度上执行一条线程的一条原子性语句,

只不过CPU切换执行速度非常快,我们无法察觉以为是同时执行

2.并发和并行

并发: 在同一个时间段同时执行

并行: 在同一个时间刻度上同时执行

3.同步和异步

同步: 并发情况下会出现同步问题

异步: 能够同一个时间段能够处理多个任务,例如ajax请求

多线程和多进程的好处

1.多线程提高了进程的使用率,从而提高CPU的使用率

2.多进程提高了CPU的使用率

方式一:继承Thread类
1.自定义类MyThread继承Thread类。
2.MyThread类里面重写run()方法。
3.创建线程对象。
4.启动线程。
注意:
1、启动线程使用的是start()方法而不是run()方法
2、线程能不能多次启动

方式二:实现Runnable接口
1.自定义类MyRunnable实现Runnable接口
2.重写run()方法
3.创建MyRunnable类的对象
4.创建Thread类的对象,并把步骤3创建的对象作为构造参数传递
5.启动线程
实现接口方式的好处
可以避免由于Java单继承带来的局限性。
适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码,数据有效分离,
较好的体现了面向对象的设计思想。 后面讲解线程同步的时候讲解

方式三:实现Callable方式开启线程

实现Runnable和实现Callable接口的区别

1.有返回值

2.可以声明异常

这里的返回值和异常抛出都是给到线程的启动者

方式四:匿名内部类开启线程

方式五开启线程: Lambda表达式开启线程

Lambda表达式是JDK1.8之后引入

本质就是方便匿名内部类的书写

函数式接口

只有一个抽象方法的接口就是函数式接口

例如 Runnable

Lambda表达式的语法

主要由三部分组成:

1.形参列表: 形式参数允许省略参数类型

2.箭头 ->

3.方法体: 由大括号包裹,当方法体中只有一条语句,{}可以省略

当一个方法有返回值的时候,如果只是返回一条语句,那么return和{}都可以省略,这个表达式结果自动作为返回值的结果返回

如何设置和获取线程的名称

设置和获取线程名称
通过构造方法
Thread(String name) 分配新的 Thread 对象。
Thread(Runnable target, String name) 分配新的 Thread 对象。
通过线程的成员方法
public final String getName()
public final void setName(String name)
通过静态方法
public static Thread currentThread()
可以获取任意方法所在的线程名称
可以获取主线程的线程名称:Thread.currentThread().getName();

long getId() 返回该线程的标识符。

线程调度

Java是如何对线程进行调度的?
Java使用的是抢占式调度模型
抢占式调度模型
优先让优先级高的线程使用 CPU,如果线程的优先级相同,
那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
设置和获取线程的优先级
public final int getPriority()
public final void setPriority(int newPriority)

线程休眠
public static void sleep(long millis)

中断线程
public final void stop()
public void interrupt()

线程加入
public final void join()

线程礼让
public static void yield()
让出CPU的执行权一小会
这里让出了CPU的执行权,并不是说把执行权交割了其他线程
而是释放了自己的执行权,自己还可以重新和其他线程抢夺执行权

后台线程
public final void setDaemon(boolean on)

一般来说,JVM(JAVA虚拟机)中一般会包括俩种线程,分别是用户线程和后台线程。
所谓后台线程(daemon)线程指的是:在程序运行的时候在后台提供的一种通用的服务的线程,
并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非后台线程结束的时候,
也就是用户线程都结束的时候,程序也就终止了。同时,会杀死进程中的所有的后台线程。
反过来说,只要有任何非后台线程还在运行,程序就不会结束。比如执行main()的就是一个非后台线程。

基于这个特点,当虚拟机中的用户线程全部退出运行时,守护线程没有服务的对象后,JVM也就退出了。

线程安全

产生线程安全的因素:
1.必须存在多线程环境
2.至少有两条语句操作了共享数据
3.如果多个线程中有一个线程对共享数据进行了写操作

综合来说:
在多线程环境下,至少有两条以上的原子性语句操作了共享数据,
并且这个操作是写操作,肯定会出现线程安全问题

如何来解决线程安全问题?
1.同步代码块
2.同步方法
3.Lock锁

1.同步代码块
格式:
synchronized(锁对象){需要同步的代码;}
注意:
a.锁对象是任意对象
b.不同线程共享同一把锁
c.同步方法的锁对象是 this
d.如果方法是静态方法,锁对象是字节码文件对象
同步的好处
解决了多线程的安全问题。
同步的弊端
当线程相当多时,因为每个线程都会去判断同步上的锁,这是很耗费资源的,
降低程序的运行效率。如果出现了同步嵌套,就容易产生死锁问题

2.同步方法
格式:
public synchronized 返回值 方法名(参数列表) {
//需要同步的代码块
}

3.Lock锁

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容