Java多线程(超详细!)

1、什么是进程么是线程/h2>

进程是:一个应用程序(1个进程是一个软件)。

线程是:一个进程中的执行场景/执行单元。

注意:一个进程可以启动多个线程。

eg.
对于java程序来说,当在DOS命令窗口中输入:
java HelloWorld 回车之后。会先启动JVM,而JVM就是一个进程

JVM再启动一个主线程调用main方法()。
同时再启动一个垃圾回收线程负责看护,回收垃圾。

最起码,现在的java程序中至少有两个线程并发,一个是 ,一个是

2、进程和线程是什么关系/h2>

进程:可以看做是现实生活当中的公司。

线程:可以看做是公司当中的某个员工。

注意:
进程A和进程B的

eg.
魔兽游戏是一个进程
酷狗音乐是一个进程
这两个进程是独立的,不共享资源。

线程A和线程B是什么关系/h2>

在java语言中:

线程A和线程B, 内存共享。但是 独立一个线程一个栈

eg.
假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。

eg.
火车站,可以看做是一个进程
火车站中的每一个售票窗口可以看做是一个线程
我在窗口1购票,你可以在窗口2购票,你不需要等我,我也不需要等你。所以多线程并发可以提高效率。


java中之所以有多线程机制,目的就是为了

3、思考一个问题

使用了多线程机制之后,main方法结束,是不是有可能程序也不会结束/h2>

main方法结束只是主线程结束了,主栈空了,其它的栈(线程)可能还在压栈弹栈。

4.分析一个问题

对于单核的CPU来说,真的可以做到真正的多线程并发吗/h2>

对于多核的CPU电脑来说,真正的多线程并发是没问题的。4核CPU表示同一个时间点上,可以真正的有4个进程并发执行。

单核的CPU表示只有一个大脑:
不能够做到真正的多线程并发,但是可以做到给人一种“多线程并发”的感觉。

对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于CPU的处理速度极快,多个线程之间频繁切换执行,给别人的感觉是:多个事情同时在做!!!

eg.
线程A:播放音乐

线程B:运行魔兽游戏

线程A和线程B频繁切换执行,人类会感觉音乐一直在播放,游戏一直在运行,
给我们的感觉是同时并发的。(因为计算机的速度很快,我们人的眼睛很慢,所以才会感觉是多线程!)

4、什么是真正的多线程并发/h2>

t1线程执行t1的。
t2线程执行t2的。
。这叫做真正的多线程并发。

5、关于线程对象的生命周期(附图)★★★★

  1. 新建状态
  2. 就绪状态
  3. 运行状态
  4. 阻塞状态
  5. 死亡状态

Java多线程(超详细!)

注意:

  • t.run() 不会启动线程,只是普通的调用方法而已。不会分配新的分支栈。(这种方式就是单线程。)

  • t.start() 方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了。
    这段代码的任务只是为了开启一个新的栈空间,只要新的栈空间开出来,start()方法就结束了。线程就启动成功了。
    启动成功的线程会自动调用run方法,并且run方法在分支栈的栈底部(压栈)。
    run方法在分支栈的栈底部,main方法在主栈的栈底部。run和main是平级的。

调用run()方法内存图:

Java多线程(超详细!)

第二种方式:

编写一个类,实现 接口,实现

  1. 怎么创建线程对象new线程类传入可运行的类/接口。
  2. 怎么启动线程呢调用线程对象的 方法。

伪代码:

eg.

采用匿名内部类创建:

注意:
第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承其它的类,更灵活。

7、获取当前线程对象、获取线程对象名字、修改线程对象名字

方法名 作用
static Thread currentThread() 获取当前线程对象
String getName() 获取线程对象名字
void setName(String name) 修改线程对象名字

当线程没有设置名字的时候,默认的名字是什么/h2>
  • Thread-0
  • Thread-1
  • Thread-2
  • Thread-3

eg.

8、关于线程的sleep方法

方法名 作用
static void sleep(long millis) 让当前线程休眠millis秒
  1. 静态方法:Thread.sleep(1000);
  2. 参数是毫秒
  3. 作用: 让当前线程进入休眠,进入“”,放弃占有CPU时间片,让给其它线程使用。
    这行代码出现在A线程中,A线程就会进入休眠。
    这行代码出现在B线程中,B线程就会进入休眠。
  4. Thread.sleep()方法,可以做到这种效果:
    间隔特定的时间,去执行一段特定的代码,每隔多久执行一次。

eg.

public class ThreadTest06 {    public static void main(String[] args) {    	//每打印一个数字睡1sfor(int i = 0; i  10; i++){

来源:一个快乐的野指针~

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月11日
下一篇 2021年4月11日

相关推荐