真的,java并发编程入门看这个就够了(代码片段)

author author     2022-12-08     478

关键词:

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

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启动多线程实现方式

上面已经给出了实例了。

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;
    

    @Override
    public void run() 
        System.out.println(Thread.currentThread().getName() + "===我是继承Thread类实现方式");
    


/**
 * 第二种方式:实现Runnable接口
 */
class PrimeRun implements Runnable 
    long minPrime;

    PrimeRun(long minPrime) 
        this.minPrime = minPrime;
    

    @Override
    public 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. 测试启动两次
     */
    @Test
    public void test1() 
        MyThread myThread = new MyThread();
        myThread.start();
        // 第二次调用会抛出异常:IllegalThreadStateException
        myThread.start();
    

    /**
     * 2. 测试run方法
     * 可以看到,run调用就是普通的方法调用,并没有启动线程去执行
     */
    @Test
    public void test2() 
        MyThread myThread = new MyThread();
        myThread.run();
        myThread.run();
    

class MyThread extends Thread 
    @Override
    public 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 
        @Override
        public 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 === true
            System.out.println(Thread.currentThread().getName() + " end interrupt flag === " + this.isInterrupted());
        
    

    @Test
    public 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 在这里查看哟~

zookeeper入门看这篇就够了(代码片段)

简介Zookeeper是一个分布式应用程序的分布式开源协调服务。是ApacheHadoop的一个子项目,主要用来解决分布式应用中经常遇到的一些数据管理问题,例如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的... 查看详情

zookeeper入门看这篇就够了(代码片段)

简介Zookeeper是一个分布式应用程序的分布式开源协调服务。是ApacheHadoop的一个子项目,主要用来解决分布式应用中经常遇到的一些数据管理问题,例如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的... 查看详情

zookeeper入门看这篇就够了(代码片段)

Zookeeper是什么官方文档上这么解释zookeeper,它是一个分布式服务框架,是ApacheHadoop下的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管... 查看详情

python从入门到精通:一个月就够了?真的能行嘛?

毫无疑问,Python是当下最火的编程语言之一。对于许多未曾涉足计算机编程的领域「小白」来说,深入地掌握Python看似是一件十分困难的事。其实,只要掌握了科学的学习方法并制定了合理的学习计划,Python从入... 查看详情

真的,web安全入门看这个就够了!

一、HTTP协议1、HTTP什么是HTTP?超文本传输协议,HTTP是基于B/S架构进行通信的,而HTTP的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、InternetExplorer、Googlechrome、Safari、Opera等HTTP是基于客户/... 查看详情

oracle11g|数据库入门看这一篇万字解析就够了(代码片段)

**如有错误,感谢指正**如有错误,感谢指正,请私信博主,有辛苦红包,拜“一字之师”。请根据目录寻找自己需要的段落导语:本博客为个人整理Java学习记录帖,如有错误,感谢指正。系统学习... 查看详情

oracle11g|数据库入门看这一篇万字解析就够了(代码片段)

**如有错误,感谢指正**如有错误,感谢指正,请私信博主,有辛苦红包,拜“一字之师”。请根据目录寻找自己需要的段落导语:本博客为个人整理Java学习记录帖,如有错误,感谢指正。系统学习... 查看详情

zookeeper入门看这篇就够了(代码片段)

什么是ZooKeeper?ZooKeeper是一个分布式的,开放源码的分布式应用程序协同服务。ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用... 查看详情

c++编程书籍推荐:零基础入门书籍,学c++看它们就够了!

如果你是一个没有编程经验的C++零基础小白,或者有其它语言经验的C++初学者,那么强烈推荐下面的十本零基础小白入门C++书籍。1.《C++Primer》作者:StanleyLippman,JoséeLajoie,andBarbaraE.Moo(更新到C&#... 查看详情

监听器入门看这篇就够了

什么是监听器监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行。。为什么我们要使用监听器?监听器可以... 查看详情

呕心沥血整理,nginx看这个就够了(代码片段)

NginxNginx官方文档OpenResty官方文档一、Nginx概述二、Nginx结构三、Nginx模块ngx_http_core_module(location、rewrite)ngx_http_access_module实现基于ip的访问控制功能实现基于用户的访问控制ngx_http_stub_status_modulengx_http_log_moduleng 查看详情

288页的python编程文档,从入门到实践,入门看这一篇就够了

Python是一门面向对象,解释型的高级程序设计语言,它的语法非常简洁、优雅,而这也是Python的一些设计哲学。Python自带了很完善的库,涵盖了数据库,网络,文件处理,GUI等方方面面,通过这些... 查看详情

json入门看这一篇就够了

什么是JSONJSON:JavaScriptObjectNotation【JavaScript对象表示法】JSON是存储和交换文本信息的语法。类似XML。JSON采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言S为什么需要JSON提到JSON,我们就应该和XML来进行对... 查看详情

elasticsearch入门,看这一篇就够了(代码片段)

Elasticsearch入门,看这一篇就够了前言可视化工具kibanakibana的安装kibana配置kibana的启动Elasticsearch入门操作操作index创建index索引别名有什么用删除索引查询索引exist索引操作document插入document查询document删除document更新document使用... 查看详情

spring入门看这一篇就够了!!!不够你找我!

今天呢,咱就来点好家伙,前面都是些java基础,怎么说也得来点框架对吧,话不多说,煌sir带你开干!干就完了!  Spring框架一.Spring简述为什么要学spring?传统项目优点:搭建容易传统项目缺点:service、dao 对象都是程序员手动n... 查看详情

elasticsearch入门,这一篇就够了(代码片段)

实时搜索引擎ElasticsearchElasticsearch(简称ES)是一个基于ApacheLucene(TM)的开源搜索引擎,无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Elasticsearch简介Elasticsearch是什么Elasticsear... 查看详情

git入门看这一篇就够了!(转)(代码片段)

...文件,将快照永久性存储到Git仓库目录。 Git使用快速入门获取Git仓库 有两种取得Git项目仓库的方法。 在现有目录中初始化仓库:进入项目目录运行 gitinit 命令,该命令将创建一个名为 .git 的子目录。从... 查看详情

matplitlib绘图入门1,这一篇就够了(代码片段)

Matplitlib绘图入门1,这一篇就够了1.绘制简单的图表(标题、标签轴、刻度轴、表说明)2.绘图辅助函数方法,绘制多个图(随机点绘制多个子图,点状、x状等)3.可交互式绘图(一图单线关闭新展... 查看详情