多线程(1)

多线程的概述

了解多线程之前需要先了解线程,而线程依赖于进程而存在,所以先了解进程。

什么是进程

进程就是正在运行的程序。是系统进行资源分配和调用的独立单位。每一个进程都有它自己的内存空间和系统资源。

什么是线程

在一个进程中又可以执行多个任务。而每一个任务,就可以看成是一个线程。

线程:是程序的执行基本单元,执行路径,是程序使用CPU的最基本单位。

单线程:程序只有一条执行路径。

多线程:程序有多条执行路径。

多线程的意义

多线程的存在,不是为了提高程序的执行速度。而是为了提高程序的使用率。

程序的执行其实是在抢CPU的资源,CPU的执行权。

多个进程在抢CPU资源,而如果其中某一个进程如果执行路径较多,其抢到CPU执行权的几率也就较高。

我们是不敢保证哪一个线程在哪个时刻能抢到CPU的执行权,所以线程的执行有随机性。

并发和并行

并发:逻辑上同时发生,指在某一时刻同时运行多个程序。(可以理解为一个CPU同时执行多个任务,那么我们称为并发)

并行:物理上同时发生,指在某一时刻同时运行多个程序。(可以理解为,多个CPU同时执行多个任务,而每一个CPU只执行了一个任务,那么称这些程序并行发生)

Java程序的运行原理·

由Java命令启动JVM,JVM启动就相当于启动一个进程。接着创建一个主线程,去调用main方法。

问题:JVM虚拟机是多线程还是单线程?

多线程。因为在JVM启动主线程时,垃圾回收线程也要先启动,否则就会出现内存溢出问题,所以当JVM启动时,最低启动了两个线程。所以JVM是多线程的。

如何启动多线程

多线程是依赖于进程存在的,所以要想实现多线程就得创建一个进程。而进程是由系统调用的,所以应该先调用系统功能创建一个进程。

Java是不能直接调用系统功能的,所以是没有办法直接实现多线程程序。

但是Java可以通过调用c/c++写好的程序来实现多线程程序,由c/c++去调用系统功能创建进程,然后由Java调用这些东西,然后提供一些类来使用就可以实现多线程程序。

Java提供Theard类实现多线程,而实现多线程的方法有两种

一.继承Theard类

步骤:

​ 1。自定义类继承Theard类。

​ 2.在自定义类中重写run()方法。

​ 为什么要重写run()方法?因为不是所以的代码都要被线程执行,为了区分哪些代码需要被线程执行,Java就提供Theard类中的run()方法来包含被线程执行的代码。

​ 3.创建对象。

​ 4.调用start()方法了,启动线程。

class myTheard extends Thread{
public myTheard(){}
public myTheard(String name){
super(name);
} @Override
public void run() {
for (int i = 0;i < 100;i++){
System.out.println(this.getName()+":"+i);
}
}
} public class theardtest {
public static void main(String[] args) {
myTheard my = new myTheard();
my.start(); myTheard my2 = new myTheard();
my2.start();
}
}
run()和start()的区别

run():仅仅是封装被线程执行代码;

start():首先启动线程,再由JVM调用该线程的run()方法。

如何设置线程对象名称
public final String getName():返回线程名称。
public final void setName(String name):设置线程名称

1.通过对象调用setName()方法修改

 myTheard my = new myTheard();
my.setName("线程1");

2.修改构造方法通过调用父类中的构造来给线程对象修改名称

class myTheard extends Thread{
public myTheard(){}
public myTheard(String name){
super(name);
} @Override
public void run() {
for (int i = 0;i < 100;i++){
System.out.println(this.getName()+":"+i);
}
}
} public class theardtest {
public static void main(String[] args) {
myTheard my = new myTheard("线程00001");
myTheard my1 = new myTheard("线程000002");
my.start();
my1.start();
}
}
如何获得main方法的线程名称
public static Thread currentThread():返回对当前正在执行的线程对象的引用。
public final String getName():返回线程名称。
Thread.currentThread().getName()

eg:
System.out.println(Thread.currentThread().getName());
out:
main

线程调度

在只有一个CPU的情况下,一个CPU在某一时刻只能执行一条指令,线程只有得到CPU时间片,即使用权,才能执行指令。有两种调度模型。

线程的两种调度模型

1.分时调度模型

所有线程轮流执行CPU使用权,平均分配每个线程占用的CPU的时间片。

2.抢占式调度模型

优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个。优先级高的线程获取CPU时间片相对多一些。

Java中的线程调度

Java是抢占式调度模型。所以每个Java线程都有优先级。

Java线程中即使没有去设置优先级,它也有默认的优先级。

Java优先级有关的方法有两个
public final int getPriority():返回线程的优先级。
public final void setPriority(int newPriority):更改线程的优先级。
注意

线程默认优先级为5

线程优先级范围是:1—10

线程的优先级仅仅表示线程获取CPU时间片的几率高,但不一定保证优先级高的线程先执行,因为CPU的调度是随机的。即在次数比较多,或多次运行程序才会看到优先级高的效果。

对线程的控制

1.线程休眠
public static void sleep(long millis) throws InterruptedException:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响

在线程的操作内调用该方法用。

线程加入
public final void join() throws InterruptedException:等待该线程终止。

让使用该方法的线程执行完毕在执行其他线程。

注意:该方法的调用位于线程开启之后。

线程礼让
public static void yield():暂停当前正在执行的线程对象,并执行其他线程。

yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU时间。注意:放弃的时间不确定,可能一会就会重新获得CPU时间片。让多个线程执行更和谐但不能保证一人一次。

后台线程
public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。

即其他非后台线程运行完成后,后台线程自动结束。通过isAlive()方法判断其他线程的是否存活。

终止线程
public final void stop():已过时。 该方法具有固有的不安全性让。线程停止。
public void interrupt():中断线程。 把线程状态终止并抛出一个异常

Javase之多线程(1)的更多相关文章

  1. JavaSE总结--多线程

    进程: 进程之间内存隔离,内存不共享. 线程: 可以共享内存. 每个线程都是一个栈. 多线程的好处: 1)防止程序阻塞. wait与notify的区别: 针对等待队列而言. wait:进入等待队列.必 ...

  2. Javase之多线程(2)

    多线程(2) 线程的生命周期 新建:创建线程对象 就绪:有执行资格,没有执行权 运行:有资格运行,有执行权 ​ 阻塞:由一些操作让线程处于改状态.没有执行资格,没有执行权,而通过另一些操作激活它,激活 ...

  3. JavaSE基础---多线程

    进程:正在进行的程序.其实就是一个应用程序运行时的内存分配空间. 线程:进程中一个程序执行控制单元,一条执行路径.进程负责的事应用程序的空间的标识,线程负责的事应用程序的执行顺序. 进程和线程的关系: ...

  4. JAVASE(十七) 多线程:程序、进程、线程与线程的生命周期、死锁、单例、同步锁

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.程序.进程.线程的理解 1.1 概念 程序(program)是为完成特定任务.用某种语言编写的一组指 ...

  5. 如何自学 Java 开发

    如何自学 Java 开发? 568赞同反对,不会显示你的姓名 李艾米IT路上学习 568 人赞同 Java Web前端技术 HTML 入门视频课程 1 HTML 简介 2 HTML基本结构[ 3 HT ...

  6. 带着新人学springboot的应用09(springboot+异步任务)

    本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...

  7. 数据库之JDBC

    1.简单认识一下JDBC 1).JDBC是什么? java database connection       java数据库连接 作用:就是为了java连接mysql数据库嘛 要详细的,就面向百度编 ...

  8. Android(java)学习笔记215:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

  9. Android(java)学习笔记158:多线程断点下载的原理(JavaSE实现)

    1. 为什么需要多线程下载?     服务器的资源有限,同时的平均地分配给每个客户端.开启的线程越多抢占的服务的资源就越多,下载的速度就越块. 2. 下载速度的限制条件? (1)你的电脑手机宽带的带宽 ...

随机推荐

  1. mybatis无效比较:invalid comparison:java.util.data and java.lang.string

    原因: 时间与空字符串比较是无效的,如果拿传入的时间类型参数与空字符串''进行对比则会引发invalid comparison:java.util.data and java.lang.string异 ...

  2. ubuntu18.04 安装 flameshot截图工具

    安装flameshot:https://github.com/lupoDharkael/flameshot sudo apt-get install flameshot 然后设置一个快捷键,设置> ...

  3. C# 判断点是否在矩形框内

    欢迎加群交流 QQ群 830426796 用 System.Drawing.Drawing2D.GraphicsPath 和 Region 类联合起来,然后用 Region.IsVisible(poi ...

  4. 《ServerSuperIO Designer IDE使用教程》- 7.增加机器学习算法,通讯采集数据与算法相结合。发布:4.2.5 版本

    v4.2.5更新内容:1.修复服务实例设置ClearSocketSession参数时,可能出现资源无法释放而造成异常的情况.2.修复关闭宿主程序后进程仍然无法退出的问题.2.增加机器学习框架.3.优化 ...

  5. 你看不懂的spring原理是因为不知道这几个概念

    背景 问题从一杯咖啡开始. 今天我去楼下咖啡机买了一杯「粉黛拿铁」.制作过程中显示: 我取了做好的粉黛拿铁,喝了一口,果然就是一杯热巧克力.咦咦咦,说好的拿铁呢?虽然我对「零点吧」的咖啡评价很高,觉得 ...

  6. Python 條件式 Condition

    除了重複使用Function,有時我們須檢查結果,依此判斷下個步驟該怎麼進行,如此就需要條件式 condition statement. if ... elif ... ese ( 或 if ... ...

  7. Jenkins自动化部署入门详细教程

    大纲 1.背景 在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试: 或者前后端分离后,经常会修改接口,然后重新部署 ...

  8. oracle常用查询sql

    oracle常用查询sql 原创 gordon陈 发布于2018-05-10 22:32:18 阅读数 297 收藏 展开 #!/bin/sh## create by Gordon Chen echo ...

  9. JVM 类的加载机制

    在对类的实例化之前.JVM 一般会先进行初始化 主要经过如下几个阶段: 1.加载                       类加载的第一阶段,类加载时机有两个: 1.预加载:当虚拟机启动时,会预加载 ...

  10. poj 1182 食物链 并查集 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=1182 题解 可以考虑使用并查集解决 但是并不是简单的记录是否同一组的这般使用 每个动物都有三个并查集 自己 天敌 捕食 并查集 那么在获得 ...