JAVA线程的一些个人理解
线程
你应该去看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)评论