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线程基础及多线程的实现的更多相关文章
- java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解
继续学习一下Thread的构造函数,在上次[http://www.cnblogs.com/webor2006/p/7760422.html]已经对如下构造都已经学习过了: 多线程与JVM内存结构的关系 ...
- java线程基础巩固---多线程死锁分析,案例介绍
之前已经学习了关于同步锁的知识,但是在实际编写多线程程序时可能会存在死锁的情况,所以这次来模拟一下死锁,并且学会用一个命令来确认是否程序已经出现死锁了,下面开始: 首先新建两个类: 此时当然得到Oth ...
- java线程基础巩固---多线程下的生产者消费者模型,以及详细介绍notifyAll方法
在上一次[http://www.cnblogs.com/webor2006/p/8419565.html]中演示了多Product多Consumer假死的情况,这次解决假死的情况来实现一个真正的多线程 ...
- Java 线程基础
Java 线程基础
- java线程基础知识----线程基础知识
不知道从什么时候开始,学习知识变成了一个短期记忆的过程,总是容易忘记自己当初学懂的知识(fuck!),不知道是自己没有经常使用还是当初理解的不够深入.今天准备再对java的线程进行一下系统的学习,希望 ...
- Java 线程基础知识
前言 什么是线程?线程,有时被称为轻量进程(Lightweight Process,LWP),是程序执行流的最小单元.一个标准的线程由线程 ID,当前指令指针 (PC),寄存器集合和堆栈组成.另外,线 ...
- java 线程基础篇,看这一篇就够了。
前言: Java三大基础框架:集合,线程,io基本是开发必用,面试必问的核心内容,今天我们讲讲线程. 想要把线程理解透彻,这需要具备很多方面的知识和经验,本篇主要是关于线程基础包括线程状态和常用方法. ...
- Java线程基础实例
概述 Java线程是一个在实战开发中经常使用的基础功能,而在Java中线程相关的类在java.lang和java.util.concurrent里 Thread package thread.base ...
- 线程之一:JAVA线程基础
参考core java,马士兵视频 1.线程的基本概念 (1)一个线程是一个程序内部的顺序控制流. (2)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...
随机推荐
- 20、oralce中单引号和双引号的区别
20.oralce中单引号和双引号的区别: 20.1.单引号和双引号oracle都支持,但是两者是有区别的: 20.2.双引号在 Oracle 中的作用: 1.双引号的作用是:假如建立对象的时候,对象 ...
- scrapy入门到放弃02:整一张架构图,开发一个程序
前言 Scrapy开门篇写了一些纯理论知识,这第二篇就要直奔主题了.先来讲讲Scrapy的架构,并从零开始开发一个Scrapy爬虫程序. 本篇文章主要阐述Scrapy架构,理清开发流程,掌握基本操作. ...
- 非静态的字段、方法或属性“System.Web.UI.Page.ClientScript.get”要求对象引用
解决Response.Write("<script>alert('修改失败,请稍后再试!');</script>");布局错误的问题 在后台CS代码(不是C ...
- vue cli3 使用elemet-plus
原文章: https://blog.csdn.net/qq_44827865/article/details/115457445 element-plus官方网站:https://element-pl ...
- Java高质量面试总结
面试 一般都是由浅到深去问,思路是: 先考察基础是否过关,因为基础知识决定了一个技术人员发展的上限 再通过深度考察是否有技术热情和深度以及技术的广度 同时可能会提出一些质疑和挑战来考察候选人能否与有不 ...
- springBoot-Quartz快速入门
springBoot-Quartz快速入门 开发环境 JDK1.8.Maven.Idea 技术栈 SpringBoot 2.1.6.quartz 2.3.0等 数据库准备 说明:数据库脚本由Quart ...
- CRM客户管理系统哪个好用
当企业管理者在进行CRM系统的选型时,面对搜索引擎上五花八门的结果和各式各样的广告,一定会有这样的疑惑:CRM客户管理系统到底哪个好用?抛开网上那些为了广告效果而"夸张"出的优点, ...
- AcWing 102. 最佳牛围栏
农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于1头,也不会超过2000头. 约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大 ...
- linux学习之路第七天(搜索查找类指令详解)
搜索查找类 1.find指令 find指令将从指定目录向下递归遍历其各个子目录,将满足条件的文件或者目录显示终端. ~基本语法 find [搜索范围] [选项] ~选项说明 应用案例 案例1 :按文件 ...
- C#下通过wbemtest和WMI Code Cretor更加高效的访问WMI
能找到这篇博客的,相信都是有操作WMI需求的了.但是不知道如何快速验证.并集成到C#来操作WMI.我们分为3步: ##第一步:官网(或跟硬件开发WMI的人沟通你需要的接口和参数定义,如果是和硬件开发的 ...