并发编程技术一之了解线程

了解线程由来

单核CPU之所以能够实现多进程,主要是依赖操作系统的进程调度算法。如时间片轮转算法,可以实现QQ、微信、浏览器同时运行,从而实现多进程。

随着计算机技术的发展,进程出现很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻量进程; 二是由于对称多处理机出现,可以满足多个运行单位,而多个进程并行开销过大。

因此在80年代,出现了能独立运行的基本单位 --- 线程。

从单核到多核

最初计算机是单任务的,然后发展到多任务,接着出现多线程并行,同时计算机也从单cpu进入到多cpu。如下图

多任务:其实就是利用操作系统时间片轮转使用的原理。操作系统通过将cpu的执行时间分割成多个时间片,为每个任务分配时间片,因为cpu处理速度很快,这样就用户看来好像每个任务都在同时执行,感觉有多个cpu,但本质上一个时间点只有一个任务在运行。

为什么会有线程?

线程切换比进程切换速度会快

在什么场景下使用多线程?

通过并行计算提高程序性能

等待网络、IO响应导致的耗时时间问题

线程的分类有哪些?

用户线程、内核线程、混合式

进程和线程的关系?

根本区别:进程是资源分配的最小单位,线程是CPU调度的最小单位

进程是一个应用程序在处理机上的一次执行过程,它是一个动态概念,而线程是进程中的一部分,进程包含多个线程在运行。

开销:每个进程都有独立的代码和数据空间,程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器,线程之间切换的开销小。

内存分配:系统在运行的时候会为每个进程分配不同的内存空间,则线程除了CPU之外,系统不会为线程分配内存,线程组之是只能共享资源。

线程的实现方法有哪些

Thread、Runnable、Callable/future

线程的状态有哪些

NEW 新建

READY 就绪

RUNNABLE 运行

BLOCKED 阻塞

  等待阻塞 wait

  同步阻塞  synchronized

  其他阻塞 sleep/join

WAITING 等待

TIMED_WAITING 超时等待

TERMINATED 终止

线程状态图如下:

 查看线程状态的代码如下:

public class ThreadStatusDemo {

   public static void main(String[] args) {

       new Thread(()->{

           while (true){

               try {

                   TimeUnit.SECONDS.sleep(100);

               } catch (InterruptedException e) {

                   e.printStackTrace();

               }

           }

       },"timewaiting").start();

       new Thread(()->{

          while (true){

              synchronized (ThreadStatusDemo.class){

                  try {

                      ThreadStatusDemo.class.wait();

                  } catch (InterruptedException e) {

                      e.printStackTrace();

                  }

              }

          }

       },"waiting").start();

       new Thread(new BlockDemo(),"BlockDemo-0").start();

       new Thread(new BlockDemo(),"BlockDemo-1").start();

   }

   static  class  BlockDemo extends  Thread{

       @Override

       public void run() {

           synchronized ( BlockDemo.class){

               try {

                   TimeUnit.SECONDS.sleep(100);

               } catch (InterruptedException e) {

                   e.printStackTrace();

               }

           }

       }

   }

}

结果

E:\lession\target\classes\com\example\lession\thread>jstack 8712

2019-01-20 15:16:20

Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed mode):

"DestroyJavaVM" #17 prio=5 os_prio=0 tid=0x00000000025ea000 nid=0xce0 waiting on condition [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"BlockDemo-1" #16 prio=5 os_prio=0 tid=0x0000000059c5c800 nid=0x27a8 waiting for monitor entry [0x000000005a5af000]

  java.lang.Thread.State: BLOCKED (on object monitor)

       at com.example.lession.thread.ThreadStatusDemo$BlockDemo.run(ThreadStatusDemo.java:42)

       - waiting to lock <0x00000000d82d41f0> (a java.lang.Class for com.example.lession.thread.ThreadStatusDemo$BlockDemo)

       at java.lang.Thread.run(Thread.java:748)

"BlockDemo-0" #14 prio=5 os_prio=0 tid=0x0000000059c5a000 nid=0xd50 waiting on condition [0x00000000598ff000]

  java.lang.Thread.State: TIMED_WAITING (sleeping)

       at java.lang.Thread.sleep(Native Method)

       at java.lang.Thread.sleep(Thread.java:340)

       at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)

       at com.example.lession.thread.ThreadStatusDemo$BlockDemo.run(ThreadStatusDemo.java:42)

       - locked <0x00000000d82d41f0> (a java.lang.Class for com.example.lession.thread.ThreadStatusDemo$BlockDemo)

       at java.lang.Thread.run(Thread.java:748)

"waiting" #12 prio=5 os_prio=0 tid=0x0000000059c59000 nid=0x24b4 in Object.wait() [0x000000005a49f000]

  java.lang.Thread.State: WAITING (on object monitor)

       at java.lang.Object.wait(Native Method)

       - waiting on <0x00000000d7fc0708> (a java.lang.Class for com.example.lession.thread.ThreadStatusDemo)

       at java.lang.Object.wait(Object.java:502)

       at com.example.lession.thread.ThreadStatusDemo.lambda$main$1(ThreadStatusDemo.java:23)

       - locked <0x00000000d7fc0708> (a java.lang.Class for com.example.lession.thread.ThreadStatusDemo)

       at com.example.lession.thread.ThreadStatusDemo$$Lambda$2/443308702.run(Unknown Source)

       at java.lang.Thread.run(Thread.java:748)

"timewaiting" #11 prio=5 os_prio=0 tid=0x0000000059c55800 nid=0x10d8 waiting on condition [0x000000005a37e000]

  java.lang.Thread.State: TIMED_WAITING (sleeping)

       at java.lang.Thread.sleep(Native Method)

       at java.lang.Thread.sleep(Thread.java:340)

       at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)

       at com.example.lession.thread.ThreadStatusDemo.lambda$main$0(ThreadStatusDemo.java:12)

       at com.example.lession.thread.ThreadStatusDemo$$Lambda$1/205797316.run(Unknown Source)

       at java.lang.Thread.run(Thread.java:748)

"Service Thread" #10 daemon prio=9 os_prio=0 tid=0x0000000058c0a000 nid=0x2134 runnable [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"C1 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x0000000058b68000 nid=0x1ea4 waiting on condition [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x0000000058b5f800 nid=0x1fac waiting on condition [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x0000000058b5e800 nid=0x2090 waiting on condition [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x0000000058b5c000 nid=0x2470 runnable [0x00000000591cf000]

  java.lang.Thread.State: RUNNABLE

       at java.net.SocketInputStream.socketRead0(Native Method)

       at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)

       at java.net.SocketInputStream.read(SocketInputStream.java:171)

       at java.net.SocketInputStream.read(SocketInputStream.java:141)

       at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)

       at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)

       at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)

       - locked <0x00000000d8030d18> (a java.io.InputStreamReader)

       at java.io.InputStreamReader.read(InputStreamReader.java:184)

       at java.io.BufferedReader.fill(BufferedReader.java:161)

       at java.io.BufferedReader.readLine(BufferedReader.java:324)

       - locked <0x00000000d8030d18> (a java.io.InputStreamReader)

       at java.io.BufferedReader.readLine(BufferedReader.java:389)

       at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:64)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x00000000588fc000 nid=0x274c waiting on condition [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000000005747f000 nid=0x1c88 runnable [0x0000000000000000]

  java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000000005745c800 nid=0x20c4 in Object.wait() [0x00000000588de000]

  java.lang.Thread.State: WAITING (on object monitor)

       at java.lang.Object.wait(Native Method)

       - waiting on <0x00000000d7d88ec8> (a java.lang.ref.ReferenceQueue$Lock)

       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)

       - locked <0x00000000d7d88ec8> (a java.lang.ref.ReferenceQueue$Lock)

       at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)

       at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000000057415800 nid=0x16e4 in Object.wait() [0x00000000587ce000]

  java.lang.Thread.State: WAITING (on object monitor)

       at java.lang.Object.wait(Native Method)

       - waiting on <0x00000000d7d86b68> (a java.lang.ref.Reference$Lock)

       at java.lang.Object.wait(Object.java:502)

       at java.lang.ref.Reference.tryHandlePending(Reference.java:191)

       - locked <0x00000000d7d86b68> (a java.lang.ref.Reference$Lock)

       at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=2 tid=0x000000005740e000 nid=0x19d0 runnable

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00000000025ff800 nid=0x638 runnable

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000002601000 nid=0x3a8 runnable

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000002602800 nid=0x1ca4 runnable

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000002604800 nid=0x2130 runnable

"VM Periodic Task Thread" os_prio=2 tid=0x0000000058c65800 nid=0x1e44 waiting on condition

JNI global references: 336

------------

再次感谢您已看完全文,欢迎关注微信公众号`猿码` ,您的关注我会持续更新文章!

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

推荐阅读更多精彩内容