我的JAVA笔记--线程
创建线程的三种方式:(IDEA中可以用alt+insert调出需要重写的方法)
1.继承Thread类
- 自定义线程类继承Thread类
- 重写run()方法,编写线程执行代码
- 创建线程对象,调用start()方法启动线程
package ThreadTest;public class MyThread01 extends Thread{@Overridepublic void run() {//方法体System.out.println("hello");}public static void main(String[] args) {Thread thread = new MyThread01();//或 MyThread01 thread = new MyThread01();thread.start();//启动线程}
}
运行结果:
hello
2.实现Runnable接口
- 自定义线程实现Runnable接口,重写run()方法,编写线程执行代码
- 创建自定义线程对象
- 创建线程对象,将自定义线程对象作为参数传入
- 线程对象调用start()方法启动线程
package ThreadTest;public class MyThread02 implements Runnable{@Overridepublic void run() {//方法体System.out.println("hello");}public static void main(String[] args) {MyThread02 myTread = new MyThread02();Thread thread = new Thread(myTread);thread.start();//线程对象调用start()方法启动线程,会执行run()方法中的内容}
}
运行结果:
hello
3.实现Callable接口
- 自定义线程实现Callable接口,重写call()方法,需要抛出异常
- 创建自定义线程对象
- 创建执行服务ExecutorService ser=Executors.newFixedThreadPool(1);//线程个数
- 提交执行Future result=ser.submit(new MyThread());
- 获取结果boolean(返回结果类型) r=result.get();
- 关闭服务ser.shutdownNow();
package ThreadTest;import java.util.concurrent.*;public class MyThread03 implements Callable {@Overridepublic Object call() throws Exception {return 1;}public static void main(String[] args) throws Exception{MyThread03 thread = new MyThread03();//创建执行服务ExecutorService executorService = Executors.newFixedThreadPool(1);//参数创建的线程个数//提交执行Future result = executorService.submit(thread);//获取结果int i = (int) result.get();System.out.println(i);//关闭服务executorService.shutdownNow();}
}
运行结果:
1
线程同步
- 同步方法:public synchronized void method(int args){ }
- 同步块:synchronized (obj){ }
- obj一般为共享资源,可以是变量也可以是对象等
package ThreadTest;public class MyThread04 extends Thread{public static int num=0;public void test02(){synchronized ((Object) num){for (int i = 0; i < 5; i++) {System.out.print(this.getName()+num+" ");num++;}}System.out.println();}@Overridepublic void run() {this.test02();}public static void main(String[] args) {MyThread04 thread01 = new MyThread04();MyThread04 thread02 = new MyThread04();MyThread04 thread03 = new MyThread04();thread01.setName("第一个线程");//Thread自带的可以设置当前线程的名字thread02.setName("第二个线程");thread03.setName("第三个线程");thread01.start();thread02.start();thread03.start();}
}
运行结果:
第一个线程0 第一个线程1 第一个线程2 第一个线程3 第一个线程4
第三个线程5 第三个线程6 第三个线程7 第三个线程8 第三个线程9
第二个线程10 第二个线程11 第二个线程12 第二个线程13 第二个线程14
- 同步锁:Lock(java.util.concurrent.locks.Lock接口)
- ReentrantLock类实现了Lock
- 方法lock()加锁
- 方法unlock()解锁
线程池
ExecutorService和Executors
ExecutorService为真正的线程池接口,常见子类ThreadPoolExecutor
常用方法:
- void execute(Runnable command):执行任务/命令,无返回值,一般用来执行实现Runnable接口的实现类或者继承Thread类的子类
- Future submit(Callable Task):执行任务,有返回值,一般用来执行实现Callable接口的线程类
- void shutdown():关闭线程池
Executors工具类,用于创建并返回不同类型的线程池
package ThreadTest;import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MyThread05 extends Thread{@Overridepublic void run() {System.out.println(this.getName());}public static void main(String[] args) {ExecutorService ser = Executors.newFixedThreadPool(3);//创建的线程池的个数MyThread05 thread01 = new MyThread05();MyThread05 thread02 = new MyThread05();thread01.setName("111");thread02.setName("222");ser.execute(thread01);ser.execute(thread02);ser.shutdownNow();}
}
运行结果:
222
111
------待补充-------
我的JAVA笔记--线程相关推荐
- 11.3-全栈Java笔记:线程的生命周期
一个线程对象在它的生命周期内,需要经历5个状态. 新生状态(New) 用new关键字建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态 ...
- 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)
在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...
- 【java笔记】线程间通信(2):生产者和消费者案例分析
[java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...
- 【java笔记】线程(5):线程安全问题
[JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 [java笔记]线程( ...
- 【java笔记】线程(4):匿名内部类创建线程
[JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 [java笔记]线程( ...
- 【java笔记】线程(3):Thread类的常用方法
[JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 获取线程的名称: St ...
- 【java笔记】线程(2):多线程的原理
[JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 多个线程并行,CPU在某个时刻 随机执行某个线程 例:随机打印结果: 多线程内存图解: 调用Thread类的 ...
- 【JAVA笔记】线程(1):多线程的介绍和实现
[java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 [java笔记]线程(3):Thread类的常用方法_m0_52043808的博客-CSDN博客 [java笔记] ...
- Java笔记11-【异常、线程】
主要内容 异常.线程 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指 ...
最新文章
- SAP RETAIL供应商寄售库存跨公司转移后的库存状况
- 纸上谈兵: 哈希表 (hash table)
- 【泰语歌】กลับคำสาหล่า 歌手:Mike Piromporn
- InputStream与DataInputStream区别
- 【接口时序】2、Verilog实现流水灯及与C语言的对比
- php访问js文件不存在,php文件里js不能被执行
- JAVA入门到精通-第6讲-成员属性-成员方法
- 智力问答 46倒计时
- Android 音频tinyalsa开发
- 事业单位计算机岗位考公基吗,江苏事业单位统考考公基吗
- 数据转换transform练习
- 计算机信息技术知识点思维导图,信息技术复习课之思维导图课例研究
- OpenWrt官方入门手册
- 三维绕任意轴旋转矩阵
- vscode自定义消息配置
- 无需下载软件pdf转jpg格式
- Java中Math函数的使用
- android的A/B到底是什么?OTA升级又是什么?
- 实例学习ansible系列(12)常用模块之docker
- 线性代数让我想想:什么是秩?
热门文章
- 深入tornado中的ioLoop
- EM算法之求解三硬币模型
- 02.关于线程你必须知道的8个问题(上)
- Java 项目案例 1、大富翁游戏系统
- Android 正确判断屏幕解锁事件
- YolactEdge: Real-time Instance Segmentation on the Edge (Jetson AGX Xavier: 30 FPS, RTX 2080 Ti: 170
- Unity HDRP示例场景解析
- ADNS5050驱动程序(Arduino)
- 基于FPGA的矩阵逆inv计算
- 最详细的基于R语言的Logistic Regression(Logistic回归)源码,包括拟合优度,Recall,Precision的计算