JAVA多线程入门

JAVA多线程入门

在学习java多线程编程的时候可以结合《操作系统》这门课一起学,这样更能掌握。

进程与线程概念

​ 在学习多线程,一定离不开进程和线程。而进程与线程之间的关系可以说是包含的关系。线程是进程的一部分。进程其实就是应用程序在内存中分配的空间,即正在运行的程序,而线程就是可以执行应用程序中的一个子任务。

举个例子:就是比如在玩游戏(LOL)的时候,当我们打开LOL游戏的时候,其实就是在启动了一个进程,打开任务管理器就可以看见有一个进程了,而在玩游戏的时候,我们肯定是要爽一波的,会想去听下游戏声音,而这个音效就相当于一个线程了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uldhxdeu-1591378967742)(F:\笔记\java_Study\多线程\多线程入门——任务管理器例子.png)]

(我说我没在玩,你信吗,好吧,玩了一把)

进程与线程的区别

进程是一个独立的运行环境,而线程就是其中执行的一个子任务。他们的本质区别就在于

  1. 是否单独占用内存地址空间和其他系统资源

    1.1、进程他单独占用一大块的内存地址空间,进程间是隔离开来的,数据也是分开占用,互不干扰,使得两进程之间的数据交换变得困难;而线程是共享属于同一个进程的资源和空间的,这样使得数据交换就方便多了。

    1.2、一个进程他就算出现了问题,他也不会影响其他的进程的执行(就比如:你的WeChat突然就卡死了,但lol还是可以继续玩),而线程,一个线程的崩溃可能就会造成整个程序的崩溃或者其他进程的崩溃。(因为数据是共享的,使得可以两线程共用一个数据)

    1.3、进程的创建和销毁的开销大,而线程的开销小。(保存寄存器、栈信息、资源的分配回收以及页调度的考虑)

  2. 进程是操作系统进行资源分配的基本单位,而线程是操作系统进程调度的基本单位。

JAVA多线程入门知识

一、创建线程方法

在JAVA中,为我们提供了Thread类和Runnable接口(最为熟悉的)来让我们实现自己的“线程”类。

  • 继承Thread类,重写run方法
  • 实现Runnable接口的run方法

其实在java中,对于创建线程有很多人有疑问,到底是有多少种创建线程的方法? 其实说只有两种也是正确的,说是有3种也是正确的,答案很多,但其实本质上来讲就只有一种创建线程的方法。创建线程的方式有很多,例如:利用线程池来创建线程、利用Callable和Future来创建线程、定时器Timer等。(这里就不多深究了)

1、通过继承Thread类创建线程

public class ThreadDemo {
	public static class MyThread extends Thread {
		@Override
		public void run() {
			System.out.println("Thread类创建线程");
		}
	}
	public static void main(String[] args) {
		Thread myThread = new MyThread() {
			myThread.start();
		}
	}
}

2、通过实现Runnable接口

public class ThreadDemo {
    public static void main(String[] args) {
        //使用JDK1.8的新特性Lambda表达式(也可以用匿名类或者直接实现)
        new Thread(()-> {
           System.out.println("实现Runnable接口创建线程"); 
        }).start();
    }
}

二、Thread类与Runnable接口的比较

其实在分析的时候,可以结合抽象类和接口的区别来进行比较,这样就更容易掌握。

在创建线程中有继承Thread类和实现Runnable接口两种,而这两种的优劣:

  • 在java中是"单继承,多实现",使得实现Runnable接口显得更灵活点。

  • 实现Runnable接口,能够降低线程对象和线程任务的耦合度。

  • 继承Thread类的话,就直接将线程对象和任务捆绑在一起,使得之间的耦合度高。

    结论: 在考虑线程的创建的时候,优先考虑实现Runnable接口。

三、Tread类中常用方法

多于Thread,我们知道了如何创建,但也要知道其中有哪些方法,具体的可以去看java api的,这里就简单的介绍一些常用的方法。

  • start(): 开始执行线程(但未开始执行,只是预备状态)
  • sleep(): 使得当前线程休眠(静态方法)
  • yield(): 让当前线程自愿让出处理器(这里是自愿的,所以可能遭拒绝的)
  • currentThread(): 返回当前正在执行的线程的引用 (静态方法)
  • join(): 使当前线程等待另一个线程执行完后再继续执行。

本文总结:本文就只是简单的讲下什么是线程和继承、线程的创建以及线程类中的方法。

对于多线程的学习:这里我提一下自己的想法:

我觉得下一步可以先去了解下:

  • 线程有几种状态?(再找一下线程的状态图啃其中的知识点,这里就放下一个线程状态转换图)
    在这里插入图片描述
    在这里插入图片描述

第二个图是我自己画的,不太好看,但由于第一个图密密麻麻的,所有我才放下我的图,这里只是为了让大家看的更简洁清晰点而已,但还是第一个图的知识全。(可以多看看其中的装换条件,然后去网上查查)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值