Java 线程

线程

1.线程的相关概念
2.线程的创建和启动 ★
3.线程的停止
4.线程的常见方法(Thread)
5.线程的生命周期 ★
6.线程的同步
7.线程的通信

线程的相关概念

概念

程序:为了让计算机完成某个特定的功能,编写的一系列有序指令的集合。
实则是一段静止的代码段

进程:正在运行的程序,它有自己的生命周期

线程:轻量级的进程。一个进程可以划分为若干个执行单位,每个执行单位可以看做是一个线程
一个进程可以包含多个线程
比如:正在运行的qq

它也有自己的生命周期

单线程:一个进程中,在同一个时刻,只能运行一个线程,必须等待该线程执行结束,其他线程才能开始执行

多线程:一个进程中,在同一个时刻,可以同时运行多个线程

    单核cpu: 仅仅只是貌似 “同时”
    多核cpu: 有可能出现真正“同时”
    
    比如:qq 同时打开多个线程,打开qq新闻、打开qq聊天窗口

多线程的好处

1、有效的占用了cpu的空闲时间,从一定程度上提高了效率
2、提高了用户的体验性
3、将一个复杂的进程拆分成若干个小的线程,提高代码的分离性和维护性

线程的创建和启动

方式一:继承Thread

定义线程类:
class MyThread extends Thread{

    public void run(){

        //编写新线程要执行的任务体
    }

}

创建新线程,并启动
new MyThread().start();

方式二:实现Runnable

定义任务类:
class MyRunnable implements Runnable{

    public void run(){
        //编写新线程的任务体
    }
}

创建新线程,并启动
new Thread(new MyRunnable()).start();

两种方式的对比★

1、方式二避免了单继承的局限性,使用更加灵活

2、方式二更适合处理多线程共享资源的情况

线程的停止

  1.stop 已经过时
  2.Interrupt 只能中断睡眠、等待这些状态,会抛出InterruptedException异常,并没有真正的结束线程
  3.采用通知的方法 ★
  
    步骤1:让需要停止的线程中添加一个循环标记,默认值为true
    步骤2:让需要停止的线程中添加一个公共的set方法,用于更新循环标记
    步骤3:需要停止该线程时,调用set方法即可

线程的常见方法 【了解】

currentThread 获取当前线程对象     //Thread.currentThread().getName();
setName设置线程名称
getName获取线程名称
setPriority设置线程优先级1——10
getPriority获取线程优先级
sleep休眠
interrupt中断休眠状态
yield线程的礼让
join线程的插队
setDaemon设置守护线程

线程的生命周期

线程的同步

理解

线程的同步实际上就是线程的安全问题。如果多个线程处理共享资源时,出现了数据安全问题,称为线程的同步问题!

线程的同步如何发生的?

当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,另一个线程参与进来执行。导致共享数据的错误

如何避免线程的同步问题?

对多条操作共享数据的语句,只能让一个线程都执行完,在执行过程中,其他线程不可以参与执行

借鉴:火车厢的洗手间的上锁的方式

线程的同步的实现方式 ★

对象+synchronized  搭配使用

方式一:同步代码块

synchronized(锁对象){

    //需要上锁的代码(同步的代码)

}

方式二:同步方法

public synchronized 返回类型 方法名(参数列表){

    //需要上锁的代码(同步的代码)

}



注意:

普通的同步方法,锁对象是:this

静态的同步方法,锁对象是:当前类.class

要求:
多个线程使用的锁对象必须是同一个!!!

线程的同步前提

1、多线程
2、有共享资源&线程的任务体中有对共享资源处理语句

使用同步的落地步骤 ★

1、先分析需要上锁的代码
2、分析需要同步代码块还是同步方法
3、检测多线程使用的锁对象是否为同一个!!!

线程的死锁

发生原因:多个线程都需要用到多把锁,每一个线程都需要对方线程的锁对象,如果多个线程互不相让,导致死锁问题

线程的通信

理解

线程的通信也就是 线程之间的 “交流”,也就是通过一定的方法,实现线程的控制!

相关的API ★

一、wait
语法:

锁对象.wait();

特点:

1、让当前线程等待,直到其他线程调用了该锁对象的notify或notifyAll方法为止,否则将一直等待
2、wait的调用 必须在同步的前提下

3、wait的调用 会导致锁的释放
4、如果等待结束也就是被唤醒后,则继续从断点处往下执行!

二、notify和notifyAll

语法:锁对象.notify()|notifyAll();

特点:

1、notify:唤醒当前锁对象下等待的单个线程。优先级较高的优先唤醒,如果优先级一样,则随机
   notifyall:唤醒当前锁对象下所有等待的线程

2、notify和notifyAll的调用,必须在同步的前提下

注意:

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