NO.33 多线程基础

多线程:多线程允许我们可以"同时"执行多段代码。

实际上多线程是并发运行的,即:JVM中的线程调度会为多个线程分配"CPU时间片",并将这些时间片尽可能均匀的分配给线程,当一个线程获取时间片后,该线程的任务代码被CPU执行,其他线程处于等待状态。这种宏观上同时运行而微观上走走停停的现象称为并发。

java中的线程是由Thread的实例表示。而Thread的创建有两种方式:

1)继承Thread并重写run方法

第一种创建线程的方式虽然定义简单,但也存在一些不足:

由于java是单继承的,这经常导致在实际开发中,为了复用一个类的方法,我们需要继承那个类,而自身又希望是一个线程时导致的继承冲突。

继承了线程需要重写run方法来定义该线程执行的任务代码,这就导致了线程与执行的任务有一个必然的耦合关系,不利于线程的重用。

2)实现Runnable接口并重写run方法来单独定义任务

下面示例怎么用匿名内部类完成线程的两种方式创建:

匿名内部类的两种方式

线程提供了一个静态方法:static Thread currentThread()

该方法可以获取运行这个方法的线程

java中所有代码都是靠线程运行的,main方法也不例外。只不过运行main方法的线程不是由我们创建的。

获取线程示例

获取线程信息的相关方法:

获取线程标识、是否存活、是否守护、是否中断

线程优先级:

对于线程调度的工作,线程不能干涉,即:线程只能被动的等待分配CPU时间片,而不能主动获取。可以通过修改线程优先级来最大程度改善获取CPU时间片的几率,理论上,线程优先级越高的线程获取CPU时间片的次数越多。

线程的优先级有10个等级,分别用整数1-10表示。其中1最低,10最高,5为默认值。

理论上完成顺序为:max、nor、min

线程提供了一个静态方法:static void sleep(long ms)

该方法会将运行当前方法的线程阻塞指定毫秒。

每隔1秒输出

守护线程----也称为后台线程

默认创建出来的线程都是前台线程,若要设置为后台线程

可以通过线程提供的方法setDaemon来完成。

后台线程使用上与前台线程一样,但是在结束时机上有一点是不同的,即:当一个进程结束时,所有正在运行的后台线程都会强制结束。而进程的结束是当一个进程中所有前台线程都结束时结束。

所以将来开发中可以将一直保持运行的任务,但是可以随着程序一同结束的放在后台线程上运行。

下面示例可以想象为泰坦尼克号中rose(一个前台进程)跳了之后,jack(守护进程)也随之jump

守护进程设置案例

线程提供了一个方法:join

join可以协调线程间同步运行

网页上文字与图片显示案例----文字先显示,等待图片下载完毕然后显示

final Thread download。。。原因:

当一个方法的局部内部类中需要引用该方法的其他局部变量时,该变量必须是final的

在这里main方法的局部内部类show中想引用main方法的其他局部变量download,那么download就必须是final修饰的。JDK1.8之后由于内存问题被重新定义,不在有这个问题,所以就不再需要做上述设定。


多线程并发安全问题:

当多个线程并发访问统一资源时,由于线程切换时机不确定,导致代码未按照设计方式的顺序执行导致的逻辑混乱。严重时可能导致系统瘫痪。

解决多线程并发安全的手段是将"各干各的"变为"排队执行":

当一个方法被synchronized修饰后,那么该方法称为“同步方法”,即:多个线程不能同时进入到方法

内部执行。

在方法上使用synchronized修饰后,上锁的对象就是当前方法所属对象,即:方法中看到的this

多线程访问将会排队执行

为避免过多的拖慢系统处理速度,有效的缩小同步范围可以在保证并发安全的前提下提高并发的效率。

synchronized修饰代码块排队执行

静态方法使用synchronized,那么一定具有同步效果

静态方法上锁的对象是该方法所属类的类对象。实际上JVM在加载一个类的class文件时,会实例化一个Class类型的实例去保存该类的信息(属性,方法等)。所以JVM中每个加载过的类都有且只有一个Class的实例用于表示它这个Class的实例就是该类的类对象。

多线程通过类名或不同对象调用dosome()方法都会排队执行

互斥锁:

同一个对象不同线程调用不同方法依然是排队执行

将集合或Map转换为线程安全的:

转换为线程安全的,防止多线程操作使混乱

但是要注意:线程安全的集合也不与迭代器遍历该集合的操作互斥。但是迭代器要求遍历的过程中不能通过集合的方法增删元素,否则会抛出异常,所以在多个线程间有这样的操作时,需要自行维护遍历集合与集合元素操作间的互斥关系。


线程池----主要解决两个问题:

1)控制线程数量。因为线程数多了,会导致内存开销大,严重时会导致系统瘫痪,并且由于线程数量多会导致CPU过度切换,拖慢系统响应。

2)重用线程

线程池执行任务

BlockingQueue是双缓冲队列。

在多线程并发时,若需要使用队列,我们可以使用Queue,但是要解决一个问题就是同步,但同步操作会降低并发对Queue操作的效率。

BlockingQueue内部使用两条队列,可允许两个线程同时向队列一个做存储,一个做取出操作。在保证并发安全的同时提高了队列的存取效率。

创建方式如下:

BlockingQueue queue = new LinkedBlockingQueue();

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

推荐阅读更多精彩内容

  • Java-Review-Note——4.多线程 标签: JavaStudy PS:本来是分开三篇的,后来想想还是整...
    coder_pig阅读 1,610评论 2 17
  • 下面是我自己收集整理的Java线程相关的面试题,可以用它来好好准备面试。 参考文档:-《Java核心技术 卷一》-...
    阿呆变Geek阅读 14,729评论 14 507
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 4,707评论 12 45
  • 一位朋友的字
    雪国的梦魇阅读 249评论 0 2
  • 2016年11月11日,这个电商界热闹非凡的日子,也是我等单身汪狂刷存在感的日子,淘宝再一次刷新了销售记录,而我们...
    小南五阅读 279评论 0 1