Java线程基础及多线程的实现
2021/8/12 14:36:07
本文主要是介绍Java线程基础及多线程的实现,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、进程和线程
1、进程:正在运行的程序
是系统进行资源分配和调用的独立单位
每一个进程都有它自己的内存空间和系统资源
2、线程是进程中的单个顺序控制流,是一条执行路径
单线程 即一个控制流,多线程即多个控制流
二、多线程的实现
1、继承Thread实现:
-
定义一个类继承Thread类
-
在类中重写run()方法
-
创建类的对象
-
启动线程
代码示例
public class ThreadDemo extends Thread{ @Override public void run() { for (int i = 1;i < 20;i++){ System.out.println(getName()+":"+i); } } public static void main(String[] args) { ThreadDemo threadDemo1 = new ThreadDemo(); ThreadDemo threadDemo2 = new ThreadDemo(); threadDemo1.setName("线程1"); threadDemo2.setName("线程2"); System.out.println(threadDemo1.getPriority()); System.out.println(threadDemo2.getPriority()); threadDemo2.setPriority(6); threadDemo1.start(); threadDemo2.start(); System.out.println(Thread.currentThread().getName()); } }
注意:
- run方法封装线程执行的代码,直接调用,相当于普通的方法
- start启动线程,然后由JVM调用此线程的run方法
获取和设置线程名称
利用getName()即可获取到线程的名称,未继承Thread的使用Thread.currentThread().getName()获取线程名称
.setName("")可设置线程名称
线程调度模型
模型分类
1、分时调度 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
2、抢占调度 优先让优先级高的线程使用CPU,如果线程的优先级相同会随机选择一个
Thread()类中获取和设置优先级的方法
- 获取优先级public final int getPriority()
- 设置优先级public final void setPriority(int newPriority)
- Thread.MIN_PRIORITY 值为1
- Thread.MAX_PRIORITY 值为10
- ThreadDemo.NORM_PRIORITY 值为 5
- 线程优先级高仅仅表示获取CPU时间片的几率高,并不是每次都会优先执行
线程的生命周期
2、实现Runnable:
- 定义一个类实现Runnable接口
- 在类1中重写run()方法
- 创建类1的对象
- 创建Threa类的对象,把类1对象作为构造方法的参数
- 启动线程
代码示例
public class RunnableDemo implements Runnable { @Override public void run() { for (int i = 1;i < 100;i++){ System.out.println(i); } } public static void main(String[] args) { RunnableDemo runnableDemo = new RunnableDemo(); Thread thread1 = new Thread(runnableDemo,"线程1"); Thread thread2 = new Thread(runnableDemo,"线程2"); thread1.start(); thread2.start(); } }
与Threa相比,实现Rnunable的好处:
- 避免了Java单继承额局限性
- 适合多个相同程序的代码处理同一个资源的情况,把线程和程序的代码、数据有效分离,较好的体现了面向对象的思维
3、实现 Callable接口(Callable接口有返回值 Runnable接口无返回值),使用ExecutorService、Callable、Future实现有返回结果的多线程
示例代码
public class CallableDemo implements Callable { //1)重写抽象方法call方法 @Override public Integer call() throws Exception { int result = new Random().nextInt(100); System.out.println("执行子线程完成某次计算,结果为"+result); return result; } public static void main(String[] args) throws ExecutionException, InterruptedException { //2)创建Callable接口实现类对象 CallableDemo callableDemo = new CallableDemo(); //FutureTask实现了RunnableFuture接口,RunnableFuture继承了Runnable接口,FutureTask接口就是Runnable接口的实现类 FutureTask<Integer> task = new FutureTask<>(callableDemo); Thread thread1 = new Thread(task); //线程池:省去了创建线程、释放线程的时间 //3)开启新的线程 thread1.start(); System.out.println("result="+task.get()); } }
这篇关于Java线程基础及多线程的实现的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-27本地多文件上传的简单教程
- 2024-11-27低代码开发:初学者的简单教程
- 2024-11-27如何轻松掌握拖动排序功能
- 2024-11-27JWT入门教程:从零开始理解与实现
- 2024-11-27安能物流 All in TiDB 背后的故事与成果
- 2024-11-27低代码开发入门教程:轻松上手指南
- 2024-11-27如何轻松入门低代码应用开发
- 2024-11-27ESLint开发入门教程:从零开始使用ESLint
- 2024-11-27Npm 发布和配置入门指南
- 2024-11-27低代码应用课程:新手入门指南