真的,Java并发编程基础入门看这个就够了
创始人
2024-02-10 13:47:12

Java并发编程学习之02Java并发编程入门指南

真的,Java并发编程入门看这个就够了

  • 1. Java天生多线程
  • 2. Java启动多线程实现方式
    • 2.1 实现代码
    • 2.2 Thread和Runnable的区别
    • 2.3 start和run方法的区别
  • 3. Java如何停止线程呢
    • 3.1 已弃用方法
    • 3.2 推荐使用
  • 4. 守护线程
  • 5. 优先级
  • 6. 线程生命周期
  • 代码仓

在这里插入图片描述

1. Java天生多线程

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;public class JavaThread {public static void main(String[] args) {// Java 虚拟机线程管理接口ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();// 线程和线程堆栈信息ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);// 打印信息for (ThreadInfo threadInfo : threadInfos) {System.out.println("[" + threadInfo.getThreadId() + "]" + " " + threadInfo.getThreadName());}}
}

可以看到启动一个类,就有如下几个线程启动了:
在这里插入图片描述

2. Java启动多线程实现方式

这里总结了一下Java启动多线程的方式。
我们先去java.lang.Thread类里面一探究竟,可以看到下面的注释。
源码里面说一般有两种方法可以创建新的执行线程。

在这里插入图片描述
在这里插入图片描述
上面已经给出了实例了。

2.1 实现代码

根据官方文档的提示,我们的两种实现线程的方式如下:

public class JavaThreadDemo {public static void main(String[] args) {// 创建第一种方式对象PrimeThread p1 = new PrimeThread(143);// 启动线程p1.start();// 创建第二种方式PrimeRun p2 = new PrimeRun(143);// 注意这里作为参数new Thread(p2).start();}
}/*** 第一种方式:继承Thread类*/
class PrimeThread extends Thread {long minPrime;PrimeThread(long minPrime) {this.minPrime = minPrime;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "===我是继承Thread类实现方式");}
}/*** 第二种方式:实现Runnable接口*/
class PrimeRun implements Runnable {long minPrime;PrimeRun(long minPrime) {this.minPrime = minPrime;}@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "===我是实现Runnable接口方式");}
}

2.2 Thread和Runnable的区别

通过上面的代码演示可以知道,线程最主要的就是Thread类Runnable接口
那他们直接的关系和区别又是什么呢?
Thread类:Java世界一切皆对象,所以对线程的抽象就是Thread类了。
Runnable接口:线程已经有抽象了,而且看接口的源码只有一个run方法,可知他是对任务的抽象,将你想并行执行的任务放到run里面即可。
在这里插入图片描述
如果在网上看到有N中实现方式,其实就是在这两个基础上衍生出来的。

2.3 start和run方法的区别

start() 是启动线程去执行,所以不管创建多线程那种方式都要用start启动。
run() 只是方法执行,并不会新建线程。

import org.junit.Test;public class StartRunThread {/*** 1. 测试启动两次*/@Testpublic void test1() {MyThread myThread = new MyThread();myThread.start();// 第二次调用会抛出异常:IllegalThreadStateExceptionmyThread.start();}/*** 2. 测试run方法* 可以看到,run调用就是普通的方法调用,并没有启动线程去执行*/@Testpublic void test2() {MyThread myThread = new MyThread();myThread.run();myThread.run();}
}
class MyThread extends Thread {@Overridepublic void run() {super.run();System.out.println(Thread.currentThread().getName() + " while running...");}
}

3. Java如何停止线程呢

有了开始一定会有终止,就像人生一样~

3.1 已弃用方法

方法名说明
stop从1.2版本就已经弃用了,会立即停止线程造成不安全,做到一半就停了会导致资源不会正常释放
suspend从1.2版本就已经弃用了,挂起线程。它天生就容易死锁。如果目标线程在监视器上持有锁,在关键系统资源被挂起时保护该资源,则在目标线程恢复之前,没有线程可以访问该资源。如果将恢复目标线程的线程试图在调用Resume之前锁定此监视器,则会导致死锁。这种死锁通常表现为“冻结”的进程。
resume从1.2版本就已经弃用了,恢复挂起线程,和suspend配合使用,容易导致死锁

为什么要弃用stop呢?
可以参考官方文档:
https://docs.oracle.com/javase/7/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.html

3.2 推荐使用

方法名说明
interrupt使得线程作为协作,对另一个线程进行中断请求,当线程处理好身后事(比如释放资源)再停止。interrupted判断线程是否被中断。静态类的isInterrupted 判断线程是否被中断,并清除标志位为false
import org.junit.Test;public class JavaThreadStopDemo {static class StopThread2 extends Thread {@Overridepublic void run() {// 输出中断标识位System.out.println(Thread.currentThread().getName() + " start interrupt flag === " + this.isInterrupted());// 判断是否有中断请求while (!this.isInterrupted()) {// 输出中断标识位System.out.println(Thread.currentThread().getName() + " while interrupt flag === " + this.isInterrupted());}// 输出中断标识位:Thread-0 end interrupt flag === trueSystem.out.println(Thread.currentThread().getName() + " end interrupt flag === " + this.isInterrupted());}}@Testpublic void testStop2() throws InterruptedException {StopThread2 stop2 = new StopThread2();stop2.start();// 延迟指定毫秒,可调节Thread.sleep(8);stop2.interrupt();}
}

4. 守护线程

主线程执行完之后守护线程也会自动消亡。
必须要在start之前设置,如果有finally也不一定执行!

Thread thread = new Thread();
thread.setDaemon(true);

5. 优先级

取值1~10直接,作用不大。

6. 线程生命周期

线程的生命周期分为:新建、就绪、运行、阻塞、消亡,五个状态。

在这里插入图片描述

代码仓

以上全部的代码:
https://gitee.com/jack0240/spring-cloud-demo.git
在这里查看哟~

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...