JAVA程序设计:线程的概念
一、前言
二、什么是线程
线程,一般指的是进程中执行任务的流程。每个进程开启后都会拥有独立的内存空间,一个进程可以执行多个线程,而多个线程共享一个进程的内存空间。线程只能是进程的一部分,它能够满足我们提高内存的使用效率。
三、线程的生命周期
线程是一个动态执行的过程,它有自己的生命周期。线程的五种状态:新建(New):java.lang.Thread或其子类创建一个新的线程,此时该线程处于新建状态,该线程一直在等待start()方法调用。就绪(Runnable):当调用该线程对象的start()方法后,此时线程处于就绪状态,该线程并没有立即执行而是一直在等待CUP的调度。运行(Running):当就绪状态的线程获取到CPU的资源后,会执行run()方法内容,此时线程处于运行状态,该线程只有处于就绪状态才能进入运行状态。阻塞(Blocked):如果一个线程执行了睡眠(sleep)、等待(wait)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:
等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡(Dead):线程执行完毕或者因异常退出,该线程结束生命周期。线程常用的调度方法:
start(): 启动,开始执行该线程任务。
run():运行,JVM调用线程任务。
wait():等待,使线程进入阻塞列队。
sleep():休眠,使正在执行线程进入睡眠状态。
join():联合,把指定的线程加入到正在执行的线程,合并该线程执行任务。
yield():让步,暂停该线程运行,并执行其他线程。
notify():唤醒,使阻塞列队的线程进入就绪状态,并等待执行。
notifyAll():唤醒,使所有的阻塞列队的线程进入就绪状态,并等待执行。
interrupt():中断,让线程暂时的放弃执行任务。
四、线程的优先级
线程的执行顺序通常与优先级相关,越高级别的优先级获得优先执行几率更大。线程的优先级是一个整数,其取值范围是1-10,数字越大优先级越高。设置线程优先级:public final int setPriority(int priority)线程常用的优先级:
Thread.MIN_PRIORITY:最小优先级,数值为1
Thread.NORM_PRIORITY:默认优先级,数值为5
Thread.MAX_PRIORITY:最大优先级,默认为10
五、实现线程的方式
5.1 继承Thread类
public class ThreadDemo extends Thread{
private String threadName;ThreadDemo(String threadName){ this.threadName = threadName;
}
@Override
public void run() { for (int i = 0; i < 10; i++) {System.out.println("Thread: " + threadName + ", " + i); try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}
}
}public static void main(String[] args) {
ThreadDemo demo1 = new ThreadDemo("Thread-1");
demo1.start(); // 启动线程1ThreadDemo demo2 = new ThreadDemo("Thread-2");
demo2.start(); // 启动线程2}
运行结果:
Thread: Thread-2, 0Thread: Thread-1, 0Thread: Thread-2, 1Thread: Thread-1, 1Thread: Thread-2, 2Thread: Thread-1, 2Thread: Thread-1, 3Thread: Thread-2, 3Thread: Thread-2, 4Thread: Thread-1, 4Thread: Thread-2, 5Thread: Thread-1, 5Thread: Thread-1, 6Thread: Thread-2, 6Thread: Thread-1, 7Thread: Thread-2, 7Thread: Thread-1, 8Thread: Thread-2, 8Thread: Thread-2, 9Thread: Thread-1, 9
5.2 实现Runnable接口
public class RunnableDemo implements Runnable{
private String threadName;RunnableDemo(String threadName){ this.threadName = threadName;
}
@Override
public void run() { for (int i = 0; i < 10; i++) {System.out.println("Thread: " + threadName + ", " + i); try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}
}
}public static void main(String[] args) {
RunnableDemo demo1 = new RunnableDemo("Thread-1"); new Thread(demo1).start(); // 启动线程1RunnableDemo demo2 = new RunnableDemo("Thread-2"); new Thread(demo2).start(); // 启动线程2}
输出结果:
Thread: Thread-1, 0Thread: Thread-2, 0Thread: Thread-1, 1Thread: Thread-2, 1Thread: Thread-2, 2Thread: Thread-1, 2Thread: Thread-1, 3Thread: Thread-2, 3Thread: Thread-2, 4Thread: Thread-1, 4Thread: Thread-2, 5Thread: Thread-1, 5Thread: Thread-1, 6Thread: Thread-2, 6Thread: Thread-2, 7Thread: Thread-1, 7Thread: Thread-1, 8Thread: Thread-2, 8Thread: Thread-2, 9Thread: Thread-1, 9
5.3 实现Callable接口
public class CallableDemo implements Callable<Integer>{ @Override
public Integer call() throws Exception { int result = 0; for (int i = 0; i < 10; i++) {result = i;System.out.println(Thread.currentThread().getName()+" "+ i );} return result;
}
}public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadScheduledExecutor();
CallableDemo callableDemo = new CallableDemo();
Future<Integer> result = executor.submit(callableDemo);
executor.shutdown();
try {Thread.sleep(1000);
} catch (InterruptedException e1) {e1.printStackTrace();
}
try {System.out.println("运行结果:"+ result.get());
} catch (InterruptedException e) {e.printStackTrace();
} catch (ExecutionException e) {e.printStackTrace();
}
}
运行结果:
pool-1-thread-1 0pool-1-thread-1 1pool-1-thread-1 2pool-1-thread-1 3pool-1-thread-1 4pool-1-thread-1 5pool-1-thread-1 6pool-1-thread-1 7pool-1-thread-1 8pool-1-thread-1 9运行结果:9
JAVA程序设计:线程的概念相关推荐
- Java多线程-线程的概念和创建
前言 声明:该文章中所有测试都是在JDK1.8的环境下. 该文章是我在学习Java中的多线程这方面知识时,做的一些总结和记录. 如果有不正确的地方请大家多多包涵并作出指点,谢谢! 一.基础概念 我们知 ...
- java利己线程_第10章 多线程2_Java程序设计与应用开发_ppt_大学课件预览_高等教育资讯网...
第十章 多线程 杨 娟 it@126.com Java 程序设计 教学内容 ? 线程的概念 ? 多线程的实现 ? 线程的生命周期 ? 线程的中断 ? 线程的优先级 ? 同步线程 ? 小结 10.1 线 ...
- 【Java 并发编程】线程简介 ( 进程与线程 | 并发概念 | 线程间通信 | Java 并发 3 特性 )
文章目录 一.进程与线程 二.并发 三.线程间通信 四.Java 并发 3 特性 一.进程与线程 最开始是没有线程这个概念的 , 一个应用程序就是一个进程 , 应用程序运行时 , 如果还要处理与用户交 ...
- java线程概念_《Java基础知识》Java线程的概念
按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业生涯始终绕不过的坎,任何一个项目都或多或 ...
- java线程池概念_Java 线程池概念、原理、简单实现
线程池的思想概述 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系 ...
- 南邮java实验_南邮JAVA程序设计实验4 线程程序设计(指针式时钟)
南邮JAVA程序设计实验4 线程程序设计(指针式时钟) 实验目的: 本实验旨在通过实验,培养学生将JAVA 线程的相关知识点(包括线程调度,线程同步等)有机结合并加以综合应用,在实验中设计多线程程序 ...
- [Java高并发系列(5)][详细]Java中线程池(1)--基本概念介绍
1 Java中线程池概述 1.1 什么是线程池? 在一个应用当中, 我们往往需要多次使用线程, 这意味着我们需要多次创建和销毁线程.那么为什么不提供一个机制或概念来管理这些线程呢? 该创建的时候创建, ...
- Java 多线程线程安全(面试概念解答二)
Java 多线程线程安全 什么是线程安全? 为什么有线程安全问题? 线程安全解决办法? 同步代码块 同步函数 静态同步函数 多线程死锁 多线程的三大特性 原子性 可见性 有序性 Java内存模型 Vo ...
- java 线程池概念、优缺点、应用场景
概念 为什么使用线程池 使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有的线程进行统一的管理和控制,从而提高系统的运行效率,降低系统运行压力:当然了,使用线程池 ...
- 线程(线程基本概念、java实现多线程、使用多线程、线程的生命周期、线程同步、线程死锁)
(一)线程基本概念 一. 程序, 进程, 线程的概念 程序: 使用某种语言编写一组指令(代码)的集合,静态的 进程: 运行的程序,表示程序一次完整的执行, 当程序运行完成, 进程也就结束了 个人电脑: ...
最新文章
- WPF Multi-Touch 开发:高级触屏操作(Manipulation)
- 再见,齐达内,再见,法国队
- Unity中的SystemInfo.deviceUniqueIdentifier 唯一ID
- [HDOJ5289]Assignment(RMQ,二分)
- figtree如何编辑进化树_进化树的注释:ggtree
- python写spark_python开发sparkSQL应用
- php5 Trace如何配置,配置参考 · ThinkPHP5.0完全开发手册 · 看云
- WinRAR v5.10 正式版
- 如何优化cocos2d的使用内存
- stm8L 触摸库使用教程 一步一步
- 合并在即:详解以太坊最新技术路线
- 阿里数据中台维度建模规范、维度模型设计及模型实施方法论
- Ultra Librarian 的安装和使用
- FTP 服务器搭建(图文教程、实现匿名与用户双登录)
- 【BSP视频教程】STM32H7视频教程第2期:STM32H7四通八达的总线矩阵,从系统框架整体把控H7
- iPhone X(iOS 14.6)在Win 10上使用iRemoval PRO v5.1.2进行越狱
- 今日头条:注册头条号3-7天就度过,掌握这四个关键点
- [MachineLearning]模型评估与模型选择
- VR,正在上演一出“风月宝鉴”
- python 通过调取百度接口进行图片OCR文字识别 高识别率
热门文章
- java中不允许一个方法在自身定义的内部调用自己_Java面向对象三大特性(基础篇)...
- elk错误:Too Many Requests
- MDC机制实现日志的链路追踪
- java 锁表后事务提交_关于synchronized锁在Spring事务中进行数据更新同步,仍出现线程安全问题...
- 凭据分配没有加密oracle_远程连接身份验证错误,又找不到加密Oracle修正
- 进程和线程不属于标准c语言,经典C语言面试题6:进程与线程的关系和区别
- 标记三维点_SSW系统在地下大型停车场三维建模中的应用研究
- python怎么从数组中提取连续的数字_从numpy数组中删除连续的数字
- python猫狗大战pytorch_深度学习实战---猫狗大战(pytorch实现)
- 服务器数据库密码修改了,服务器密码修改后数据库