35:Java多线程:初识Java多线程
Java多线程学习
本文是java多线程的一个入门的基础知识。
首先需要记住这两个单词:Process进程、Thread线程,
在说进程和线程之前,还必须说一下 :程序,这个词。
程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
听起来很抽象,这里为了好理解可以将这里的程序理解为我们写的Java源代码。代码没有运行就是死的是静态的。
进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位。
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的的单位。
说了一大堆其实就一句:把代码跑起来就是进程,进程里面可以有若干个线程。 这个是三者之间的关系。
在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程。main()称之为主线程,为系统的入口,用于执行整个程序。在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;线程会带来额外的开销,如cpu调度。每个线程在自己的工作内存交互,内存控制不当会造成数据不一致.
进程和线程的区别
- 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。(进程是资源分配的最小单位)
- 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
线程的创建
在java中要想实现多线程,有3种手段,
- 继承Thread类(重点)
- 实现Runable接口(重点,推荐,最常用)
- 实现Callable接口(了解即可,本文不讲)
继承Thread类创建线程
package com.thread_xiancheng;
//继承Thread类创建线程
//继承Thread类
public class Thread03 extends Thread {
//定义私有属性name
private String name;
//构造方法
public Thread03(String name) {
this.name = name;
}
//重写run方法
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + "运行:" + i);
}
}
//调用
public static void main(String[] args) {
//创建两个对象thread01、thread02
Thread03 thread01 = new Thread03("线程01"); //传入name
thread01.start(); //启动线程
Thread03 thread02 = new Thread03("线程02");
thread02.start();
}
}
执行结果:
执行结果:
线程02运行:0
线程02运行:1
线程01运行:0
线程01运行:1
线程01运行:2
线程01运行:3
线程01运行:4
线程02运行:2
线程02运行:3
线程02运行:4
分析过程:
程序启动运行main时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建。随着调用thread01、thread02的两个对象的start方法,另外两个线程也启动了,这样,整个应用就在多线程下运行。
- 注意start()方法的调用后并不是立即执行多线程代码,而是使得该线程变为可运行态(Runnable),什么时候运行是由操作系统决定的.
- 从程序运行的结果可以发现,多线程程序是乱序执行。因此,只有乱序执行的代码才有必要设计为多线程。
- 有时候程序执行太快无法看到效果,可以使用Thread.sleep()方法,不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
- 实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。
- start方法重复调用的话,会出现
java.lang.IllegalThreadStateException
异常。
实现Runnable接口创建线程
package com.thread_xiancheng;
//实现Runnable接口创建线程
//实现接口
public class Thread04 implements Runnable {
//定义线程的名字
private String name;
//构造方法
public Thread04(String name) {
this.name =
原文地址:https://blog.csdn.net/annita2019/article/details/143816451
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!