Java并发编程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java并发编程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3243字,纯文字阅读大概需要5分钟。
内容图文
![Java并发编程](/upload/InfoBanner/zyjiaocheng/624/328ef6f06f4247c398356e94f9ea03bf.jpg)
多线程
线程的五种状态
新建状态(NEW)
当程序使用 new 关键字创建了一个线程之后,该线程就处于新建状态,此时仅由 JVM 为其分配
内存,并初始化其成员变量的值
就绪状态(RUNNABLE)
当线程对象调用了 start()方法之后,该线程处于就绪状态。 Java 虚拟机会为其创建方法调用栈和
程序计数器,等待调度运行
运行状态(RUNNING)
如果处于就绪状态的线程获得了 CPU,开始执行 run()方法的线程执行体,则该线程处于运行状
态
阻塞状态(BLOCKED)
阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了cpu资源,暂时停止运行。
直到线程进入可运行(runnable)状态,才有机会再次获得 cpu资源转到运行(running)状
态。阻塞的情况分三种:
- 等待阻塞(o.wait->等待对列):运行(running)的线程执行 o.wait()方法, JVM 会把该线程放入等待队列(waitting queue)
中 - 同步阻塞(lock->锁池):运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线
程放入锁池(lock pool)中 - 其他阻塞(sleep/join):运行(running)的线程执行 Thread.sleep(long ms)或 t.join()方法,或者发出了 I/O 请求时,
JVM 会把该线程置为阻塞状态。当 sleep()状态超时、 join()等待线程终止或者超时、或者 I/O
处理完毕时,线程重新转入可运行(runnable)状态
死亡状态(DEAD)
线程会以下面三种方式结束,结束后就是死亡状态
- 正常结束:run()或 call()方法执行完成,线程正常结束
- 异常结束:程抛出一个未捕获的 Exception 或 Error
- 调用stop():直接调用该线程的 stop()方法来结束该线程,该方法通常容易导致死锁,不推荐使用
创建线程的四种方式
继承Thread类
通过集成Thread类并重写run方法实现
public static void main(String[] args) {
MyThread myThread = new MyThread("Thread1");
myThread.start();
}
static class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程执行");
}
}
实现Runnable接口
通过实现Runnable接口并实现run方法创建一个线程
public static void main(String[] args) {
// 实现Runnable接口
new Thread(() -> System.out.println(Thread.currentThread().getName() + "线程执行"), "Thread1").start();
}
结合lambda表达式一句代码搞定
实现Callable接口(带返回值)
通过实现Callable接口并实现call方法结合FutureTask创建一个线程,通常适用于带有返回值的情况
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 实现Callable接口
FutureTask<Integer> futureTask = new FutureTask<>(() -> {
System.out.println(Thread.currentThread().getName() + "线程执行");
return 1;
});
Thread thread = new Thread(futureTask);
thread.start();
// 阻塞等待线程执行结果
Integer result = futureTask.get();
}
终止线程的两种方式
stop方法(不推荐)
程序中可以直接使用 thread.stop()来强行终止线程,但是 stop 方法是很危险的,就象突然关
闭计算机电源,而不是按正常程序关机一样,可能会产生不可预料的结果,不安全主要是:
thread.stop()调用之后,创建子线程的线程就会抛出 ThreadDeatherror 的错误,并且会释放子
线程所持有的所有锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用
thread.stop()后导致了该线程所持有的所有锁的突然释放(不可控制),那么被保护数据就有可能呈
现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。因
此,并不推荐使用 stop 方法来终止线程
interrupt方法
使用interrupt方法中断线程时如果线程处于阻塞状态的话会抛出异常
四种线程池
newCachedThreadPool
newFixedThreadPool
newSchduledThreadPool
newSingleThreadPool
守护线程
Java锁
乐观锁
悲观锁
自旋锁
Synchronized同步锁
ReentrantLock
JUC框架思维导图
JUC并发包类库
内容总结
以上是互联网集市为您收集整理的Java并发编程全部内容,希望文章能够帮你解决Java并发编程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。