多线程的概念及实现方式
多线程的相关概念
程序(programm):
一个固定的逻辑和数据的集合体,一般是静态的资源,存在磁盘路径下,即指一段静态的代码。
进程(process):
概念:就是正在运行的程序,他是动态的程序,一般存在于内存中,统筹管理程序的所有资源。 程序的一次执行过程,或是正在运行的一个程序。
说明:进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
线程(thread):
在进程中独立运行的一条线路,是进程的一个组成单位一个进程有多条线程组成。
一个Java应用程序java.exe,其实至少三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。
并行:
同一时刻多条线程同时发生并运行互不干扰的现象【涉及的执行者是多个】
并发:
同一时间段内多条线程交替执行的的现象【同时请求 涉及的执行者只有一个】
CPU的调度机制:
分时调度:
有计划有安排的进行程序的执行。【效率不高】
抢占式调度:
CPU要程序进行抢,谁抢到cpu谁就运行。
java虚拟机多数是抢占式调度【多线程执行遵守抢占式调度】
多线程的实现方式
概述:
线程是进程的组成单位,每条线程为进程做一件事情,线程和线程之间互不影响。
之前学习的所有代码都是一条线程【main线程】完成。
多线程的实现方式指的是创建新的线程出来并开启做事情
创建新线程的方式有:
1、继承Thread类【java中使用类Thread 描述了线程的相关属性和功能 对象就是新线程】
2、实现Runnable接口
继承Thread类
概述:
Thread类就是java对线程进行描述形成的一个类,类中描述了线程的相关性能所以创建一条自己想要的新线程可以自定义类去继承Thread类。
步骤:
1、定义一个类继承Thread类
2、重写Thread类中的run方法【在方法中指定新线程要做的事情】
3、在main中创建新线程类的对象【真正的线程】
4、调用start方法启动线程对象【后台自动的调用run方法】
代码示例:
新线程
public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; ; i++) {System.out.println("这是一条新线程" + i);}}
}测试类
public class TestMyThread {public static void main(String[] args) {//开启新线程(线程级别和main方法级别一样)//执行的时候要和main方法抢cpu的执行权MyThread t = new MyThread(); //一条新线程//开启线程t.start(); //主线程要做的事情for (int i = 0;; i++) {System.out.println("这是一条主线程" + i);}}}
实现Runnable接口
概述:
继承实现方式中创建线程类是固定的去指定任务,把run方法单独出来,单独书写,Runnable 接口中正好有一个run方法能够实现这个需求,可以定义一个类作为Runnable接口的实现类,重写run方法完成线程任务的书写,将来把任务给线程对象来执行就ok。
好处:
任务和线程对象分开,可以降低耦合性,利于开发维护【低耦合高内聚】
步骤:
1、定义类实现Runnable接口(创建线程任务类)
2、重写run方法【书写线程任务】
3、创建线程任务对象 (Runnable实现类)
4、创建线程类Therad对象,并绑定任务对象
4、开启线程【调用start方法】
代码示例:
实现类: //1、定义Runnable接口的实现类
public class RunnableDemo implements Runnable{//2、重写run方法@Overridepublic void run() {for (;;) {System.out.println("我是Runnable实现类中的方法");}} }测试类:
public class TestRunnableDemo {public static void main(String[] args) {//3、创建Runnable接口实现类的对象RunnableDemo rb = new RunnableDemo();//4、创建线程任务对象,并绑定任务Thread thread = new Thread(rb);//5、开启线程thread.start();//主线程任务for (;;) {System.out.println("我是主线程");}}}
匿名内部类实现方式:
是继承和接口实现两种方式的格式的变换【不想定义字类或实现类,还可以开启新线程】
代码示例:
public class ThreadDemo02 {public static void main(String[] args) {//创建匿名内部类,完成继承的新线程方式new Thread() {@Overridepublic void run() {for (;;) {System.out.println("我是继承方式创建的");}}}.start();//匿名内部类实现接口new Thread(new Runnable() {@Overridepublic void run() {for (;;) {System.out.println("我是接口实现方式创建的");} }}) .start();}}
Thread 常用方法
概述:
Thread类是java对线程的一种描述,定义线程的相关属性和功能
1、构造方法:
Thread():
创建一个没有人为定义任务和线程名称的线程对象
系统默认的线程名称:Thread-x 【x是一个数字 从0开始 一次加1】
Thread(String name):
创建一个没有人为定义任务,有线程名称的线程对象
Thread(Runnable r):
创建一个有人为定义任务,没有线程名称的线程对象
Thread(Runnable r,String name):
创建一个有人为定义任务,有线程名称的线程对象
2、常用方法:
getName():
获取调用线程对象的线程名称
注意:
有人为命名的名字返回命名的名字
没有返回默认的名字:Thread-x【从0开始依次加1】
setName(String name):
给线程改名字
setDaemon(boolean b):
设置线程为守护线程
参数为true就是守护线程false不是守护线程
守护线程:
线程创建出来不是守护线程属于执行线程
守护线程就是给执行线程提供正常运行的一个环境,如果所有的执行线程都消失了,守护线程就没有存在的意义,过一段时间jvm就会自动停止运行,守护线程就结束
最典型的守护线程:垃圾回收线程
isDaemon():
判断线程是不是守护线程
3、静态方法:
currentThread():
获取当前线程的线程对象 (谁调用就是谁)
sleep(long s):
线程休眠
代码示例:
public class ThreadDemo3 {public static void main(String[] args) {//创建一个没有人为定义任务和线程名称的线程对象Thread thread = new Thread();//创建一个没有人为定义任务,有线程名称的线程对象Thread thread2 = new Thread("thread01");//创建一个有人为定义任务,没有线程名称的线程对象Thread thread3 =new Thread(new Runnable() {@Overridepublic void run() {System.out.println("我是有人为定义任务,没有线程名称的线程");}}); //创建一个有认为定义任务,有线程名称的线程对象Thread thread4 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("我是有人为定义线程任务,有线程名称的线程");try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}finally {System.out.println("我睡眠了3秒");}}},"thread02");//获取调用线程对象的线程名称System.out.println(thread.getName()); //Thread-0System.out.println(thread2.getName()); //thread01System.out.println(thread3.getName()); //Thread-1System.out.println(thread4.getName()); //thread02//给线程改名字thread.setName("th1");System.out.println(thread.getName()); //th1//先判断线程是否为守护线程System.out.println(thread.isDaemon()); //false//设置线程为守护线程 设置为true,则为守护线程thread.setDaemon(true);//判断线程是否为守护线程System.out.println(thread.isDaemon()); //true//静态方法 (通过类名调用)//获取当前对象的调用对象Thread ct = Thread.currentThread();System.out.println(ct); //Thread[main,5,main]//启动使用睡眠方法的线程thread4.start();}
}
练习
1、获取主方法所在的线程的名称
2、获取垃圾回收线程的线程名称
3、判断垃圾回收线程是否是守护线程
代码示例:
public class ThreadDemo4 {public static void main(String[] args) {//获取主方法所在的线程名称//先获取主线程对象Thread ct = Thread.currentThread();//通过主线程对象获取名称String name = ct.getName();System.out.println(name);//获取垃圾回收线程的线程名称和判断是否为守护线程//创建一个对象(作为垃圾)new ThreadDemo4();//调用垃圾回收器System.gc();}@Overrideprotected void finalize() throws Throwable {//获取垃圾回收线程的线程名称和判断是否为守护线程//得到垃圾回收器的对象Thread ct2 = Thread.currentThread();//获取名称String name = ct2.getName();System.out.println(name);//判断是否为守护线程boolean boo = ct2.isDaemon();System.out.println(boo);}}
多线程的概念及实现方式相关推荐
- 多线程,了解-概念-实现方式-常见方法-安全问题-死锁-生产者消费者
了解 简单了解多线程 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 简单了解多线程 简单了解多线程 简单了解多线程 简单 ...
- JavaEE多线程基本概念 及 创建多线程程序的三种方式
Hello! 大家好.(非常平庸的开场白 习惯一下).此篇博客是我的"处女作",因为是第一次写博客,在文章格式以及文章内容可能会有许多问题和缺陷.欢迎各位大神对我的文章进行指正!我 ...
- java几种多线程_Java多线程实现的几种方式
Java多线程实现的几种方式 多进程是计算机中的一个重要概念,通常一个任务称为一个进程,比如浏览网页.播放音乐都是一个进程. 在进程内部可能还需要执行多个子任务,比如在使用word文档打字的时候,不仅 ...
- Java 多线程基本概念
多线程基本概念 线程相关概念 Java多线程 继承Thread类创建线程 实现Runnable接口创建线程 使用Callable和Future创建线程 多线程以上创建方式区别 使用继承Thread类的 ...
- Java基础21 多线程线程两种实现方式 锁
一.多线程的概念 1.程序 :一个固定逻辑与数据的集合 就称为程序 例如淘宝 贪吃蛇小游戏 2.CPU: 中央处理器 主要用于协调程序与硬件进行配置的工作 3.并发与并行 1.并发(高并发) 在同一个 ...
- 多线程实现的几种方式
多线程实现一共有四种方式,如下图: - pthread的使用 - 定义pthread typedef __darwin_pthread_t pthread_t; - 创建pthread int pth ...
- JAVA多线程实现的三种方式
文章目录 继承Thread类实现多线程 实现Runnable接口方式实现多线程 区别 ExecutorService/Callable/Future实现有返回结果的多线程 步骤 概念 实例(可忽略) ...
- 29.Linux网络编程熟练掌握 TCP 状态张换图熟练堂握端口复用的方法了解半关闭的概念和实现方式了解多路10 转接模型熟练掌握 select 函数的使用熟练使用 fdset 相关函数的使用能够编写
把昨天的 第二天的内容说一下,复习一下,第二天 讲的东西不算多,但是有两个作业题来写一写, 大致浏览一下,三次握手 四次挥手的过程,大家有没有画一下? 能画出来吗?同学们,大家注意 这个写代码的时候其 ...
- java中ajax概念_Java之AJAX概念和实现方式
Java之AJAX概念和实现方式 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-12 1.概念: Asynchronous JavaScript An ...
最新文章
- 2021年春季学期-信号与系统-第十四次作业参考答案-第五小题参考答案
- 全部python编程语言-编程语言高质量代码的优秀Python工具
- JAVA关系表达式解析微引擎
- CNN结构:色彩空间建模-色彩空间分析
- Dead Pixel CodeForces - 1315A(思维)
- Destroying Array(并查集)
- Java DB嵌入式模式
- 都是用Redis的服务器,12306为啥干不过淘宝???
- 帝国cms内容页调用php,帝国CMS内容页调用上一篇与下一篇方法汇总
- GUI编程(一)-----概述
- yolov5模型框架详解
- 如何在手机上编码python_如何在Python中进行热编码?
- js定义对象时属性名是否加引号问题
- 计算机设置调整吃鸡,绝地求生韦神托马斯主播的电脑画面设置灵敏度_绝地求生主播的电脑画面设置和灵敏度介绍_游戏吧...
- 堕落了!经典软件下载网站被查
- 丐帮 beggar gangs
- layer添加元素 openlayer_OpenLayers 官网例子的中文详解
- mc服务器优化mod,【教程】minecraft服务器优化教程 让你用低配置带更多人!
- 多商户商城系统功能拆解39讲-平台端营销-砍价记录
- Grib数据转NC数据