• 创建线程的三种方式

    1.继承Thread类

    2.实现Runnable接口

    3.实现Callable接口

  • 继承Thread类

    public Test extends Thread{
    public void run(){
    ...
    }//必须重写Thread类的Run方法
    ...
    public static void main(String[] args){
    Test test = new test();//先new线程对象
    test.run();//调用线程方法
    test.start();//调用线程
    ...
    }
    }

    不同调用方式,cpu执行的方式也不同

    线程开启后不一定立即执行,由cpu调度算法调度执行

    为了验证副线程确实是穿插在主线程中进行的,我把主线程循环次数拉到了千位才成功

  • 实现Runnable接口

    (1)用自定义类实现Runnable接口

    public class RunnableTest implements Runnable{
    ...}

    (2)实例化类对象,用Thread线程代理(开启线程)

    RunnableTest test=new RunnableTest();
    new Thread(test).start();//线程代理

    避免单继承的局限性,推荐使用实现Runnable接口方法,可实现对多个对象的代理

  • 实现Callable接口

    ExecutorService ser = Executors.newFixedThreadPool(1) //创建执行服务(固定大小(n)的线程池)
    Future<Boolean> result1 = ser.submit(t1);//提交执行:
    boolean r1 = result1.get()//获取结果
    ser. shutdownNow();//关闭服务
    //Callable接口需要有返回值类型 implements Callable<T>{}
    //与此同时,必须重写带有T型返回值的Call方法
Lamda表达式
  • 函数式接口:只包含一个抽象方法的接口

    //  (参数)->{...方法体};
    //单参数时可省略括号
    //单行方法体可以省略花括号
    //只有函数式接口可以用Lamda表达式,下方是一个实现Runnable接口的Lamda表达式
    Runnable a=()->System.out.println("this is Lamda");
    a.run();
线程状态

线程方法
  • Thread thread=new Thread();
    //线程启动
    thread.start();
    //线程停止(盲目调用线程停止方法有风险,推荐使用标志量停止线程)
    thread.stop();
    thread.destory();
    //线程礼让,停止该线程,重新调度
    thread.yield();
    //线程睡眠,以毫秒为单位
    thread.sleep()
    //强制执行该线程,阻塞其他线程
    thread.join();
    //获取线程状态
    thread.getState();
    //获取和修改线程优先级
    thread.getPriority();
    thread.setPriority(int);
    //设置守护线程(随用户线程死亡而死亡)
    thread.setDaemon(boolean);
线程同步

​ 并发:多个线程同时操作同一对象

​ 为了避免访问冲突,在访问时加入锁机制synchronized,保证访问线程独占资源

​ 修饰符synchronized可以将一个方法或者块修饰为同步方法/同步块,同步方法必须获得调用该方法的对象的锁,才能拿被执行,方法执行时独占该锁,执行完毕才能开锁。

​ 同步方法的锁对象默认是当前this类对象,如果所共享资源不在该对象中,则可以用同步块实现同步

  • synchronized(Object){...}//Object为实际需要同步的锁对象

​ 可重入锁,ReentrantLock

  • class A{
    private final ReentrantLock lock = new ReenTrantLock();
    public void m(){
    lock.lock();
    try{
    //保证线程安全的代码;
    } finally{
    lock.unlock();
    //如果同步代码有异常,要将unlock()写入finally语句块
    }
    }
    }
线程通信
  • wait()//表示线程一直等待,直到其他线程通知,与sleep不同,会释放锁
    wait(long timeout)//指定等待的毫秒数
    notify()//唤醒一个处于等待状态的线程
    notifyAll()//唤醒同-一个对象上所有调用wait()方法的线程,优先级别高的线程优先调度
线程池

在经常需要线程创建和销毁的大型程序中,使用线程池可以避免资源浪费,实现重复利用。

使用方法类似于Callable接口实现,提供了两种执行线程的方法

  • execute(new Thread);//无返回值的线程执行
    submit(new Thread);//带返回值的线程执行,返回值为一个Future<boolean>类型

Java基础篇——多线程的更多相关文章

  1. Java基础篇---多线程

    内容导航: 1.多线程的实现方式 2.线程安全问题 3.线程间通信 4.生产者消费者模式 第一部分多线程的实现方式 在java中多线程实现方式有2种 一.自定义一个类A,继承Thread类 publi ...

  2. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  3. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  4. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  5. java基础篇---HTTP协议

    java基础篇---HTTP协议   HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...

  6. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  7. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  8. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

  9. java基础篇1

    JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...

  10. Java基础篇(JVM)——类加载机制

    这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...

随机推荐

  1. 细聊.Net Core中IServiceScope的工作方式

    前言 自从.Net Core引入IOC相关的体系之后,关于它的讨论就从来没有停止过,因为它是.Net Core体系的底层框架,你只要使用了.Net Core的时候就必然会用到它.当然关于使用它的过程中 ...

  2. 齐博x1服务器性能太差,调整系统升级每次校验的文件数

    系统升级需要校验本地的文件是否被修改过,系统默认每次检验1千个文件,一般来说需要分四到五页来处理,如下图所示. 如果你的服务器性能太差的话,就需要手工把数值调小.把下面的代码复制出来.进入后台数据库管 ...

  3. 齐博x2模型里边钩子的创建与使用

    在模型里边的钩子创建与使用方法跟在控制器里边的钩子创建及使用方法是有所区别的在模型里边创建的钩子,你可以理解为执行一个函数,是无法调用模型里边的类的方法及属性的.比如系统文件\application\ ...

  4. redis位图(bitmap)常用命令的解析

    描述   bitmap是redis封装的用于针对位(bit)的操作,其特点是计算效率高,占用空间少,常被用来统计用户签到.登录等场景 常用命令及解析 常用命令 setbit key offset va ...

  5. Redis管理及监控工具推荐

    推荐一款Redis管理软件.[官网 http://www.redisant.cn/] 功能描述: 1. 键和字段CRUD和glob. 2. 适用于字符串.列表.散列.集合.有序集合. 通过漂亮的用户界 ...

  6. 打不开 github 的方法与推荐基于Vue3与Element plus的后台管理系统

    一.打不开 github 的方法 1.打开本机 hosts 文件(C:\Windows\System32\drivers\etc) 2.然后在 hosts 文件里的末尾放入一下两个 IP 地址: # ...

  7. DHorse的链路追踪

    目前,DHorse的链路追踪功能是通过SkyWalking来实现.实现原理是DHorse在部署应用时,通过指定SkyWalking的Agent来收集服务的调用链路信息.下面就来具体看一下DHorse如 ...

  8. 【Java框架】SSM-Spring总结:IOC、DI、AOP、JDBC、事务管理、实际案例

    〇.概述 1.常用资料 2.组成 一.控制反转与依赖注入 (一)Spring概述 1.介绍 以IOC和AOP为内核的框架 通过IOC实现控制,使用spring创建对象,与DI描述同一个概念 DI是对象 ...

  9. 5V升压12.6V芯片电路图,三节锂电池充电

    三节3.7V的锂电池串联,11.1V和最大12.6V锂电池充电电路的解决方案.在应用中,一般使用低压5V,如USB口直接输入的给三串锂电池充电,还有是15V或者18V,20V输入降压给锂电池充电的两种 ...

  10. 关于解决pip安装python第三方库超时的问题

    直接换源下载 1. 设置超时时间,安装txt 文件内安装包 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --default-time ...