谈谈你对Java多线程的理解以及多线程的实现方式

说线程之前先说进程,何为进程?进程就是正在进行中的程序.
比如电脑同时在运行QQ进程、cmd进程、wps进程、飞秋进程等。
在某一时刻,CPU只能执行一个程序,只是在做快速切换,我们肉眼看不出来。

比如:我有一些箱子,我一个人去搬,搬了一个又一个,很累,如果有5个人一起搬,就更快了
5个人同时去搬都在一个进程中完成,这5个人叫线程,线程是进程中的内容。

进程:是一个正在执行中的程序
每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程:就是进程中的一个独立的控制单元。
线程在控制着进程的执行。
一个进程中至少有一个线程,至少有一个控制单元。

java VM 启动的时候会有一个进程java.exe,该进程中至少有一个线程负责Java程序的执行
而且这个线程运行的代码存在于main方法中,该线程称之为主线程。
JVM启动不止一个线程,还有负责垃圾回收机制的线程。

任何一个代码执行的时候都会进内存,线程的控制单元依次往下执行,而负责执行的代码都在线程。
线程的出现让我们的程序有同时出现的效果,多线程能帮我们提高效率,目的在于能使多个代码同时运行。


线程是程序中的执行线程,Java虚拟机允许应用程序并发的运行多个线程
每个线程都有一个优先级,高优先级线程的执行优于低优先级的线程。当某个线程中运行的代码创建一个新Thread对象时,
该线程的初始优先级被设定为创建线程的优先级。

从语义上去理解,想成为异常就继承exception,想成为线程就继承Thread,成为我的小弟你就是我的了,你就拥有了我所有用的属性及方法了。

那么如何在代码中自定义一个线程?
通过对api的查找,Java已经提供了对线程这类事务的描述,就是Thread类
创建线程的第一种方式:继承Thread类
步骤:
1、定义类继承Thread
2、覆写Thread类中的run方法
3、调用该方法:调用线程的start方法
该方法有两个作用:启动线程,调用run方法

new一个对象就是在创建线程,创建了之后并没有执行,所以要调用start方法才能被执行
那怎么执行呢?调用run方法

 而:

可以看到,执行顺序会乱,而且每次运行的结果都不同。

因为多个线程都在获取CPU的执行权,CPU执行到谁,谁就执行

 明确一点:在某一时刻,只能有一个程序在运行(多核除外)

 CPU在做着快速切换,以达到看上去是同时运行的效果

我们可以形象的把多线程的运行行为是在相互争夺CPU的执行权

 多线程就一个特性:随机性,谁抢到谁执行,至于执行多长,CPU说的算

创建线程的第二种方式:实现Runnable接口,Runnable接口定义如下:

public interface Runnable{

  public void run();

}

 

线程已经创建好了,但是需要注意的是,如果想要启动一个线程肯定是 Thread类中的run()方法完成,通过观察Thread类中提供的构造方法:public
Thread(Runnable target) 通过构造发现,Thread类可以接受Runnable子类的对象,所以一切的线程都可以通过Thread类进行启动。

对于Thread类和Runnable接口本身都是可以进行多线程的实现,两者区别:
1、继承局限:使用Runnable接口可以避免单继承的局限,而Thread类则有此局限
2、资源共享:使用Runnable接口实现多线程,可以实现资源(对象属性)的共享,而Thread类无法实现

原文地址:https://www.cnblogs.com/lanyy/p/8629785.html