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)线程和进程 –每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大. –线程:轻量 ...
随机推荐
- Devexpress-WPF初体验
最近使用wpf devexpress做一个wpf小项目,中间遇到了一些问题,这里记录下,同时也跟大家分享分享 1.devexpress安装 devexpress提供了很多控件,特别是各种形式的数据列表 ...
- js 判断是什么浏览器加载页面
一.Navigator 属性: 1)appcodeName 返回浏览器代码名 2)appminorVersion 返回浏览器次级版本 3)appname 返回浏览器名称 4)browserLan ...
- 计算机、程序和java简介
内存 计算机的内存是由一个有序的字节序列组成,用于存储程序及程序需要的数据.你可以将内存想象成计算机执行程序的工作区域.一个程序和它的数据在被CPU执行前必须移到计算机的内存中. 每个字节都是有一个唯 ...
- SpringBoot集成websocket发送后台日志到前台页面
业务需求 后台为一个采集系统,需要将采集过程中产生的日志实时发送到前台页面展示,以便了解采集过程. 技能点 SpringBoot 2.x websocket logback thymeleaf Rab ...
- 在一个py脚本中调用另外一个py脚本中的类或函数
1.两个文件在同一目录,直接import即可 2.两个文件在不同目录 在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路 ...
- MySQL中的联表查询与子查询
0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...
- CQOI 2021 游记
CQOI 2021 游记 Stage -1 \(\texttt{NOIP}\) 考的比较爆炸所以觉得自己没啥指望了. Stage 0
- python05篇 json和函数
一.json json就是一个字符串,只不过是所有语言能解析这个字符串.1.1 把python的数据类型转为json import json d = {'name': 'xiaohei', 'cars ...
- C语言:编程求任意月份的天数
闰年问题,因为二月份的天数与闰年有关.闰年的判断依据是:若某年能被4整除,但不能被100整除,则这一年是闰年:若某年能被400整除,则这一年也是闰年 #include <stdio.h> ...
- 聪明的YZH
[题目描述](杨子恒大佬) 聪明的YZH又开始搭积木了-- 他用1*1*1的立方体在n*m的平面搭积木,举几个他的杰作: 现在他又搭完了一个完美的杰作,他很好奇这对积木的表面积是多大 . [输入格式] ...