JAVA线程的一些个人理解

November 16, 2022 作者: yijianhao 分类: java 浏览: 145 评论: 0

线程

你应该去看JDK官方文档,而不是看我这篇文章:
https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html

大部分操作系统支持的进程间通信(IPC: Inter-Process Communication)方式为:

  • pipes 管道
  • sockets

IPC 不仅在进程通信中被使用,还在不同的系统中被使用。
大部分的JAVA虚拟机都是单进程的,不过JAVA可以使用ProcessBuilder去创建其他进程

线程也被称为“轻量进程”,相比于创建进程创建一个新的线程需要更少的资源。线程存在于进程之中,每个进程至少含有一个线程,线程共享进程的资源,包括内存和打开的文件,这种方式非常高效,但是同时也会引发一些问题。

有两种创建线程的方式:

  • 实现Runable接口
  • 继承Thread类,并重写run方法(Thread类他自己实现了Runable接口)

第一种方式还能再继承其他类,所以更通用,但是一般继承Thread更简单易用

线程常见方法

Thread.sheep()

让线程睡眠,它可以被中断(interrupts)终止。

Thread.interrupt()

  • 如果线程中含有能够抛出InterruptedException异常的方法,比如Thread.sheep(), 线程就会抛出InterruptedException异常
  • 如果线程中没有能够抛出InterruptedException异常的方法,则在线程中可以使用Thread.interrupted来判断是否已经执行了Thread.interrupt()

join

等待线程完成

Syncronization

线程键通信主要通过共享字段和对象引出字段的访问。这种方式很高效,但会导致两个问题:线程干扰内存一致性错误

  • 线程干扰:线程A执行的结果会被线程B覆盖因而丢失。
  • 内存一致性错误:线程A修改了变量x,但是线程B就能立即读取到已经修改好的值。

可以使用Syncronization来防止这种情况的发生,引用Syncronization的方法可以称为同步方法:

  • 当同步方法被A线程调用时,其他线程访问该方法时就会被挂起,直到线程A执行结束
  • 当同步方法退出时,它会自动与同一对象的同步方法的任何后续建立先行关系(happend-befored),这保障了对象状态的修改对所有线程都是可见的。

构造函数无法使用Syncronization,因为没有意义

但是使用Syncronization会引入线程争夺,当两个或两个以上的线程同时访问同一资源的时候,会导致JAVA运行时执行多个线程的时候会变得更慢,甚至会停止执行,死锁之类的。

#概念(3)

评论