不是太细的java自学笔记进阶篇1(p389-p447)(多线程,线程的四种实现方法,同步代码块,同步方法,线程通信)

81 篇文章 2 订阅
订阅专栏
34 篇文章 1 订阅
订阅专栏

笔记同样基于此教学视频,我觉得讲的很好了内容也很全面,适合自学:

教程是这个

目录:

1.多线程基础

第一种方法创建线程:通过java.lang.Thread包创建线程。

第二种方法创建线程:

2.解决线程安全问题

方式1:同步代码块(synchronized)

方式2:同步方法

方法3:Lock锁

3.线程通信

4.java5.0新增的线程创建方式

1.实现Callable接口

2.使用线程池


1.多线程基础

 

方法区和堆是一个进程一份

栈和程序计数器是一个线程一份

 

第一种方法创建线程:通过java.lang.Thread包创建线程。

  

如果直接调用t1.run()不会开启新线程,必须要调用start方法。每个线程只能启动。如果多个线程,则写多个class,重写多个run方法。

要是只用一次可以直接写匿名子类

  

yield()释放当前cpu的执行权。可能下次分配资源又到本资源。

join()在线程a中调用线程b的join方法,此时a阻塞,直到b执行完,线程a才继续执行。

sleep(long milliontime)指定休眠需要时间。

isAlive()是否存活

  

从概率上讲,高优先级的线程先执行的概率更高。

 

第二种方法创建线程:

   

使用start方法,调用了当前线程的run方法,其实start调用了runnable类型的target的run()

 

上述两种方式的比较:

第一种方式中本身有可能需要继承其他父类,如果继承了thread类会导致没法继承其他类(类的单继承局限性)。第一种方式没法进行数据共享。需要额外加static。

开发中优先选择实现Runnable接口的方式。

在底层中Thread是Runnable接口的实现。最终都是重写run方法。

 

2.解决线程安全问题

方式1:同步代码块(synchronized)

synchronized(同步监视器俗称锁){ //需要被同步的代码 (操作共享数据的代码) }

任何一个类的对象都可以充当锁,按时多个线程要共用一个锁。(需要注意锁的位置,要保证唯一锁)

继承thread时不可以把锁写成this(慎用)。实现Runnable方式时可以使用this作为锁(原理为第二种创建多线程方法的特性),同样可以使用类来充当锁

代码块不要包多了,很可能导致某个线程从头到尾,也不能包少了。

方式2:同步方法

如果某个方法中全部需要解决线程安全则可以把这个方法声明为一个synchronized方法

没有显示的声明同步监视器,使用this作为监视器。

此方法在继承Thread中需要把方法声明为static方法,这样可以调用我们继承的类作为锁。

 

方法3:Lock锁

   

本方法和synchronized方法的异同:

相同:都是解决线程安全问题

不同:synchronized自动的释放同步监视器

   lock需要手动的启动同步

3.线程通信

线程通信的三个方法

wait():阻塞线程,释放同步监视器

notify():唤醒一个线程,多个线程阻塞则唤醒优先级高的

notifyAll():唤醒所有线程

注意:

1.只能在同步方法和同步代码块中使用,否则无法获得锁。

2.上述三个方法必须调用的是同步方法或者是同步代码块中的监视器

3.上述三个方法是定义在object类中。

sleep()和wait()的异同?

相同:都使线程进入阻塞状态

不同:声明位置不同,sleep在Thread类中,wait在Object类中

调用要求不同,sleep任何位置都可以,wait只能在同步方法或者是同步代码块中

sleep不会释放锁,wait会

这里举一个消费者生产者的例子用于学习:

结果:

代码:

package com.lzy.javatest;

/**
 * @author: lzy
 * @description: 生产者消费者问题商店最多:0
 * @date: 2020-09-04-9:59
 */

class Clerk{//店员

    private int productCount=0;

    public synchronized void produceProduct() {
        if(productCount<20){
            productCount++;
            System.out.println(Thread.currentThread().getName()+":开始生产产品:"+productCount);
            //只要生产了一个产品就可以开始消费了
            notify();
        }
        else{
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public synchronized void consumeProduct() {
        if (productCount>0)
        {
            System.out.println(Thread.currentThread().getName()+":开始消费产品:"+ productCount);
            productCount--;
            //只要消费了一个产品就可以开始生产了,解除阻塞
            notify();
        }else{
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class Producer extends Thread{//生产者
    private Clerk clerk;

    public Producer(Clerk clerk){
        this.clerk=clerk;
    }

    @Override
    public void run() {
        System.out.println(getName()+"开始生产产品");
        while (true){
            clerk.produceProduct();
        }
    }
}

class Consumer extends Thread{//消费者
    private Clerk clerk;

    public Consumer(Clerk clerk){
        this.clerk=clerk;
    }

    @Override
    public void run() {
        System.out.println(getName()+"开始消费产品");
        while (true){
            clerk.consumeProduct();
        }
    }
}

public class ProductTest {
    public static void main(String[] args) {
        Clerk clerk=new Clerk();
        Producer p1=new Producer(clerk);
        p1.setName("生产者1:");
        Consumer c1=new Consumer(clerk);
        c1.setName("消费者1:");
        p1.start();
        c1.start();
    }
}

4.java5.0新增的线程创建方式

1.实现Callable接口

相比Runnable更加强大

可以有返回值,可以抛出异常,支持泛型的返回值,需要借助FutureTask类

2.Future接口

   

案例代码:

package com.lzy.javatest;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @author: lzy
 * @description: 第三种方式创建线程 ,实现Calable接口
 * @date: 2020-09-04-15:34
 */
//创建一个callable实现类
class NumThread implements Callable{
//实现call方法
    @Override
    public Object call() throws Exception {
        int sum=0;
        for (int i=0;i<100;i++){
            if(i%2==0){
                System.out.println(i);
                sum+=i;
            }
        }
        return sum;
    }
}

public class Thread3th {
    public static void main(String[] args) {
        //创建实现类对象
        NumThread numThread=new NumThread();
        //实现类的对象床底到FutureTask类中作为参数,创建FutureTask对象
        FutureTask futureTask=new FutureTask(numThread);
        //缺少这一句就无法启动线程
        new Thread(futureTask).start();
        //输出结果        
        try {
            Object sum=futureTask.get();
            System.out.println(sum);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

2.使用线程池

提前创建多个线程,放入线程池中,使用时直接获取,使用完放回线程池中,可以避免频繁创建销毁实现重复利用。(类似私家车和公交车)

好处:提高响应速度,降低资源消耗,便于线程管理

  

package com.lzy.javatest;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @author: lzy
 * @description:创建线程第四种方法-线程池
 * @date: 2020-09-04-15:56
 */

class NumberThread implements Runnable{

    @Override
    public void run() {
        System.out.println("启动NumberThread线程");
    }
}

public class Thread4th {
    public static void main(String[] args) {
        //制造一个线程池
       ExecutorService service= Executors.newFixedThreadPool(10);
       //设置线程池的属性
        //注意这里需要强转为ThreadPoolExecutor类型,因为ExecutorService是一个接口
        ThreadPoolExecutor service1=(ThreadPoolExecutor)service;
        service1.setCorePoolSize(15);
        //创建一个实现类和其对象,根据实现不同使用不同的方法调用线程
       service.execute(new NumberThread());//适合Runnable
       //service.submit();//适合Callable
        //关闭连接处
        service.shutdown();
    }
}

需要注意的是,这个地方设置线程池的属性,需要把类型强转成其实现类的类型。接口并没有实现控制线程池的方法。

根据源码我们可以看到:

ThreadPoolExecutor是AbstractExecutorService的子类,AbstractExecutorService又是ExecutorService接口的实现类。

 

 

 

 

 

 

 

Java多线程同步、runnable、callable接口
http://www.onlyze.cn/
09-13 493
一、多线程      1 多线程第一种方式的实现步骤(继承Thread类)         1、定义类重写Thread类;         2、重写里面的run方法,在run方法中定义线程要执行的任务。         3、创建Thread子类对象         4. 调用子类对象的start方法,启动线程。 public class Demo01Thread {     publ...
2.28 学习记录 Callable接口 线程同步和死锁
trh_csdn的博客
02-29 410
利用Callable接口实现多线程。 使用Runnable接口可以解决单继承局限,但是Runnable接口也有自己的缺点就是Runnable接口里面的run方法不能返回操作结果。 import java.util.concurrent.Callable; class MyThread implements Callable<String>{//多线程主体类 private int t...
万字图解Java多线程
qq_35598736的博客
09-06 6万+
前言 java多线程我个人觉得是javaSe中最难的一部分,我以前也是感觉学会了,但是真正有多线程的需求却不知道怎么下手,实际上还是对多线程这块知识了解不深刻,不知道多线程api的应用场景,不知道多线程的运行流程等等,本篇文章将使用实例+图解+源码的方式来解析java多线程。 文章篇幅较长,大家也可以有选择的看具体章节,建议多线程的代码全部手敲,永远不要相信你看到的结论,自己编码后运行出来的,才是自己的。 什么是java多线程? 进程与线程 进程 当一个程序被运行,就开启了一个进程, 比如启动了qq,w.
Java多线程的五种实现方式
2401_84411879的博客
04-18 1106
分布式技术专题+面试解析+相关的手写和学习的笔记pdf《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
java多线程自学笔记
Ramelon的博客
06-13 1217
多线程 单进程单线程:一个人在一个桌子上吃菜 单进程多线程:多个人在同一个桌子上一起吃菜 多进程单线程:多个人每个人在自己的桌子上吃菜。 synchronized:判断线程是否被霸占,是则等待,反之,占用。 什么是多线程 线程是操作系统能够进行运算调度的最小单位;它被包含在进程之中,是进程中的实际运作单位。 多线程,是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。 简单来说:线程是程序中一个单一的顺序控制流程;而多线程
Java学习路线总结,搬砖工逆袭Java架构师
热门推荐
学Java,找哪吒
09-07 25万+
定期分享Java硬核技术干货、分享Java学习路线、分享Java经典面试题
Java进阶(四十二)Java多线程使用匿名内部类的方式进行创建3种方式_匿名内部类的写法,完成多线程
m0_60666452的博客
04-21 1122
更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。
某大厂开发者对于Java多线程的总结,14-注解实现AOP
2401_84009679的博客
04-19 986
System.out.println(“更新了一个用户”);System.out.println(“查询了一个用户”);
Java学习篇 -- 多线程笔记(带你看不一样的多线程~)
2401_84047990的博客
05-15 796
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
Java多线程自学笔记
01-19
### Java多线程自学笔记知识点总结 #### 一、Java多线程概念 - **多线程定义**:多线程是指程序中可以同时执行多个线程的能力。Java虚拟机支持多线程机制,允许应用程序在不同的线程上并行执行任务。 - **线程特点...
计算机-java-自学笔记
最新发布
05-28
7. 核心库:Java Standard Edition (Java SE) 包含了大量的核心库,如集合框架、I/O流、网络编程、多线程等,为开发者提供了丰富的功能。 8. 集合框架:Java集合框架是处理对象集合的工具,包括List、Set、Queue、...
javase基础自学笔记-java开端-概述
05-07
自学笔记将带你初识Java,从概述开始,逐步深入理解这个强大的编程工具。 首先,让我们从"Java开端-概述"入手。Java是一种面向对象的编程语言,由Sun Microsystems(现已被Oracle收购)在1995年发布。它的设计...
C++的引用&
小旻
09-16 2万+
1.引用的实质是对一个内存空间起别名 注意:引用必须初始化,引用有自己的内存空间!!!! #include<iostream> using namespace std; int main() { int a = 10; int &b = a;//此时改变b的值就是改变a的值 cout << a << endl; ...
操作系统_多级反馈队列调度算法
小旻
12-17 8784
1、设置 N 个就绪进程队列,即队列 0,队列 1,……,队列 N-1,用于存放就绪进程。每个队列 优先级不同,且从队列 0 到队列 N-1,优先级依次递减。  2、不同队列中的进程所赋予的时间片长度不同;优先级越低,时间片越长,比如,队列 0 中进程 的时间片为 5,队列 1 中进程的时间片为 10 等等。 3、在队列内部,进程之间采用先来先服务(FCFS)算法辅以时间片限时机制进行调度:位于队...
html&css笔记完整版
小旻
10-23 4535
把1,2合在一起了,方便查看 教程指路:这里 目录 1.导入 京东界面练习(p102-114) 设置网站图标(用在标题栏和收藏栏) 2.vscode使用 3.html 实体 meta标签: 语义化标签 块元素和行内元素 列表 超链接 路径: 图片标签 内联框架 音视频 表格table 表单form CSS 设置样式: 语法: 选择器: 单个选择器: 复合选择器: 父子兄弟选择器: 属性选择器 伪类选择器: 否定伪类: 超链接伪类: 伪元素选.
mysql自学笔记(基础篇)(内容超多警告,有目录)
小旻
10-06 1596
看的教程在这里->这里 也不算笔记,更像是一个字典和案例 并且主要都是截图 1,登录 2.语法要求 DQL语言 基础查询 语法:select 列,列2,列3 from 表 可以查表中的字段,常量,表达式,函数 别名 去重: mysql中的+: 只有数值加法的功能,。如果是有String则尝试转换成数值类型。 如果失败了返回结果0 +左右有null结果就是null musql中的拼接: IFNULL ifnull(判断的内容,如...
卸载mysql不干净重装,和出现的各种问题汇总
小旻
08-07 1585
引言:之前做毕设的时候mysql出了各种问题导致一下心急就把mysql卸载了用sqlite,但是当时傻了吧唧的就把mysql文件夹删掉了,一下子各种重装出问题,这两天重新搞了一下。记录一下出现的问题和解决方法。 我这是按照我粗线的问题进行排序的,要是你在中间就重装成功了即可停下操作。 1.首先需要关闭mysql服务,删除注册表信息(具体参考:这个网页) 2.删除之后重新安装,因为之前的没有压缩包没有卸载所以直接解压然后接着用。注意需要配置my.ini文件中的路径 3.配置环境变量(网上教程太多不详细
java全栈开发学习路线和教程分享(持续补充2021.5.12)
小旻
03-29 1533
这里是我的学习路线,做一下总结和分享,如果对看到的人有一丢丢帮助那也不错。每一个教程都是我已经看完的,没有看的教程我是不会贴上来的,或者有明确标注。路线差不多是按照我的学习进度来写的。有很多还没看所以就先写一个标题,等看了教程在分享我觉得不错的教程。要是不知道怎么看直接从上往下看就行。 最终目标是能够写一个完整的前后端项目,包括前后端分离的项目。 教程全都是b站的,大致为尚硅谷,狂神,还有一些少数的其他的教程,分为核心和补充。 !!!!很多视频底下评论就有资料,多翻一下都可以找到!!!! 核心 1
Java多线程基础与实战教程
Java多线程自学笔记主要探讨了Java编程语言中如何处理并发执行的基本...本篇自学笔记详述了Java多线程的基本原理、优先级管理、线程创建方法以及线程生命周期管理,这对于理解和应用并发编程在Java中的实践至关重要。
写文章

热门文章

  • C++的引用& 22586
  • 操作系统_多级反馈队列调度算法 8781
  • C++test 白盒测试 8151
  • ASP.NET MVC一个视图使用多个Model 5707
  • html&css笔记完整版 4534

分类专栏

  • python 10篇
  • django 1篇
  • 计算机基础 3篇
  • linux&shell 1篇
  • mysql 3篇
  • 设计模式 3篇
  • shiro 1篇
  • JavaScript 4篇
  • 前端 11篇
  • java 34篇
  • Vue 8篇
  • docker 1篇
  • html&css 3篇
  • Spring 1篇
  • SpringBoot2 7篇
  • Mybatis 4篇
  • swagger 1篇
  • Maven 2篇
  • leetcode 1篇
  • 阿里云ECS 2篇
  • PAT乙级 27篇
  • 自学 81篇
  • 代码 30篇
  • 操作系统 2篇
  • C++test 1篇
  • MVC 2篇

最新评论

  • C++的引用&

    m0_74138649: 因为他有病

  • django中redis缓存装饰器的简单实现

    _mika_: 呜呜呜 我哭死

  • 数据库思维导图

    烟烟233: 太强啦大佬

  • C++的引用&

    _mika_: 我们修旻真是太棒辣

  • java 8 API 开发文档中文

    疯狂java杰尼龟: 乱码。。。

最新文章

  • pycharm pip ssl失败
  • [C++]指针常量&常量指针&常量引用
  • python 一个二维数组创建的坑
2023年4篇
2022年14篇
2021年29篇
2020年65篇
2019年10篇
2018年8篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家山西创意玻璃钢雕塑哪家便宜福建超市商场美陈销售企业玻璃钢人物运动雕塑定做仿铜玻璃钢雕塑订做价格沧州玻璃钢雕塑制作深圳玻璃钢人物雕塑尺寸玻璃钢鱿鱼雕塑商场仿真花美陈浙江玻璃钢海豚雕塑价格天津玻璃钢花盆花器零陵玻璃钢花盆花器商场美陈赚钱吗三门峡肖像玻璃钢仿铜雕塑玻璃钢仿铜仙鹤雕塑兰州玻璃钢雕塑销售襄城玻璃钢雕塑费用佛山玻璃钢透光雕塑现货遵义玻璃钢景观雕塑景观小品马鞍山玻璃钢卡通雕塑清远抽象玻璃钢雕塑南宁抽象玻璃钢雕塑订做价格湛江创意玻璃钢雕塑白城酒店玻璃钢雕塑玻璃钢骆驼雕塑哪家值得信赖惠州玻璃钢透光雕塑公司泸州商场美陈道具玻璃钢主题ip雕塑山东商场美陈厂家直销云浮玻璃钢卡通雕塑销售厂闵行区拉丝玻璃钢雕塑免费咨询香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化