创建线程的三种方式:(IDEA中可以用alt+insert调出需要重写的方法)
1.继承Thread类

  1. 自定义线程类继承Thread类
  2. 重写run()方法,编写线程执行代码
  3. 创建线程对象,调用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接口

  1. 自定义线程实现Runnable接口,重写run()方法,编写线程执行代码
  2. 创建自定义线程对象
  3. 创建线程对象,将自定义线程对象作为参数传入
  4. 线程对象调用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接口

  1. 自定义线程实现Callable接口,重写call()方法,需要抛出异常
  2. 创建自定义线程对象
  3. 创建执行服务ExecutorService ser=Executors.newFixedThreadPool(1);//线程个数
  4. 提交执行Future result=ser.submit(new MyThread());
  5. 获取结果boolean(返回结果类型) r=result.get();
  6. 关闭服务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笔记--线程相关推荐

  1. 11.3-全栈Java笔记:线程的生命周期

    一个线程对象在它的生命周期内,需要经历5个状态. 新生状态(New) 用new关键字建立一个线程对象后,该线程对象就处于新生状态.处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态 ...

  2. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)

    在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...

  3. 【java笔记】线程间通信(2):生产者和消费者案例分析

    [java笔记]线程间通信(1):等待唤醒机制_m0_52043808的博客-CSDN博客 类: 资源类:包子类:皮,馅,有无 生产者: 包子铺类(线程类)(继承Thread) 设置线程任务(run) ...

  4. 【java笔记】线程(5):线程安全问题

    [JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 [java笔记]线程( ...

  5. 【java笔记】线程(4):匿名内部类创建线程

    [JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 [java笔记]线程( ...

  6. 【java笔记】线程(3):Thread类的常用方法

    [JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 获取线程的名称: St ...

  7. 【java笔记】线程(2):多线程的原理

    [JAVA笔记]线程(1):多线程的介绍和实现_m0_52043808的博客-CSDN博客 多个线程并行,CPU在某个时刻 随机执行某个线程 例:随机打印结果: 多线程内存图解: 调用Thread类的 ...

  8. 【JAVA笔记】线程(1):多线程的介绍和实现

    [java笔记]线程(2):多线程的原理_m0_52043808的博客-CSDN博客 [java笔记]线程(3):Thread类的常用方法_m0_52043808的博客-CSDN博客 [java笔记] ...

  9. Java笔记11-【异常、线程】

    主要内容 异常.线程 第一章 异常 1.1 异常概念 异常,就是不正常的意思.在生活中:医生说,你的身体某个部位有异常,该部位和正常相比有点不同,该部位的功能将受影响.在程序中的意思就是: 异常 :指 ...

最新文章

  1. SAP RETAIL供应商寄售库存跨公司转移后的库存状况
  2. 纸上谈兵: 哈希表 (hash table)
  3. 【泰语歌】กลับคำสาหล่า 歌手:Mike Piromporn
  4. InputStream与DataInputStream区别
  5. 【接口时序】2、Verilog实现流水灯及与C语言的对比
  6. php访问js文件不存在,php文件里js不能被执行
  7. JAVA入门到精通-第6讲-成员属性-成员方法
  8. 智力问答 46倒计时
  9. Android 音频tinyalsa开发
  10. 事业单位计算机岗位考公基吗,江苏事业单位统考考公基吗
  11. 数据转换transform练习
  12. 计算机信息技术知识点思维导图,信息技术复习课之思维导图课例研究
  13. OpenWrt官方入门手册
  14. 三维绕任意轴旋转矩阵
  15. vscode自定义消息配置
  16. 无需下载软件pdf转jpg格式
  17. Java中Math函数的使用
  18. android的A/B到底是什么?OTA升级又是什么?
  19. 实例学习ansible系列(12)常用模块之docker
  20. 线性代数让我想想:什么是秩?

热门文章

  1. 深入tornado中的ioLoop
  2. EM算法之求解三硬币模型
  3. 02.关于线程你必须知道的8个问题(上)
  4. Java 项目案例 1、大富翁游戏系统
  5. Android 正确判断屏幕解锁事件
  6. YolactEdge: Real-time Instance Segmentation on the Edge (Jetson AGX Xavier: 30 FPS, RTX 2080 Ti: 170
  7. Unity HDRP示例场景解析
  8. ADNS5050驱动程序(Arduino)
  9. 基于FPGA的矩阵逆inv计算
  10. 最详细的基于R语言的Logistic Regression(Logistic回归)源码,包括拟合优度,Recall,Precision的计算