Java基础篇——多线程
创建线程的三种方式
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基础篇——多线程的更多相关文章
- Java基础篇---多线程
内容导航: 1.多线程的实现方式 2.线程安全问题 3.线程间通信 4.生产者消费者模式 第一部分多线程的实现方式 在java中多线程实现方式有2种 一.自定义一个类A,继承Thread类 publi ...
- 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇
Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...
- 小白—职场之Java基础篇
java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...
- java基础篇---I/O技术
java基础篇---I/O技术 对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...
- java基础篇---HTTP协议
java基础篇---HTTP协议 HTTP协议一直是自己的薄弱点,也没抽太多时间去看这方面的内容,今天兴致来了就在网上搜了下关于http协议,发现有园友写了一篇非常好的博文,博文地址:(http: ...
- java基础篇---I/O技术(三)
接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...
- Java基础篇 - 强引用、弱引用、软引用和虚引用
Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...
- java基础篇 之 构造器内部的多态行为
java基础篇 之 构造器内部的多态行为 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...
- java基础篇1
JAVA基础篇1 注释 单行注释 //这是一个单行注释,由两个斜杠组成,不能嵌套多行注释 多行注释 /*这是一个 多行注释 ,//里面不能嵌套多行注释, 但是可以嵌套单行注释*/ 文档注释 /**ja ...
- Java基础篇(JVM)——类加载机制
这是Java基础篇(JVM)的第二篇文章,紧接着上一篇字节码详解,这篇我们来详解Java的类加载机制,也就是如何把字节码代表的类信息加载进入内存中. 我们知道,不管是根据类新建对象,还是直接使用类变量 ...
随机推荐
- Node.js躬行记(24)——低代码
低代码开发平台(LCDP)是无需编码(0代码)或通过少量代码就可以快速生成应用程序的开发平台.让具有不同经验水平的开发人员可以通过图形化的用户界面,通过拖拽组件和模型驱动的逻辑来创建网页和移动应用程序 ...
- github使用Webhooks实现自动化部署
参考: https://blog.csdn.net/u013764814/article/details/85240752 -------------------------------------- ...
- Vue学习之--------Scoped样式(2022/8/1)
1.场景 一个页面开发团队进行页面的开发设计.无可避免的会发生样式选择器命名的重复(id的重复.class的重复等).这样间接导致的后果就是.自己的页面样式好好的.在整合一起的时候.可能就会发生样式的 ...
- C语言/python实现定时关机
1.python def shutdown(): print('(1)定时关机\n(2)取消定时关机\n(3)立即关机\n(4)关机重启') b = eval(input('请选择:\n')) if( ...
- 42.JSON Web Token认证
JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...
- Scrapy 之 docker splash
Scrapy 之 docker splash 1. ubuntu 安装docker 命令 curl -sSL https://get.daocloud.io/docker | sh 或者 curl - ...
- React 函数组件
React 函数组件 1.定义方式 React 函数组件是指使用函数方法定义的组件. 定义方式:与函数的定义方式相同,需要将内容 return 出来,需要注意的是最外层只有一个标签或者使用<&g ...
- 基于 .NET 7 的 QUIC 实现 Echo 服务
前言 随着今年6月份的 HTTP/3 协议的正式发布,它背后的网络传输协议 QUIC,凭借其高效的传输效率和多路并发的能力,也大概率会取代我们熟悉的使用了几十年的 TCP,成为互联网的下一代标准传输协 ...
- NC-日志配置及代码详解
目录 一.日志文件输出说明 二.日志配置说明 2.1 配置文件路径 2.2 配置格式 2.2.1 参数说明 三.代码说明 四.自定义日志实例 实例1-新建日志类 实例2-直接在代码中使用日志输出 五. ...
- springboot集成支付宝的支付(easy版)
SpringBoot对接支付宝 需要先注册账号 到支付宝开发者平台创建网页支付应用 启用公钥模式 需要使用到appId和下面的两个秘钥 写配置信息的代码 1.引入依赖 <dependency&g ...