JAVASE----基础(八)

本文详细介绍了Java中的多线程知识,包括进程与线程的区别,线程的创建方式(继承Thread类、实现Runnable接口、实现Callable接口)以及线程池的使用,探讨了为什么要使用线程池以及线程的生命周期和状态。此外,还讨论了解决多线程安全问题的方法,如synchronized、volatile和Atomic类,并讲解了线程间通信的wait、notify方法及Lock与Condition。
摘要由CSDN通过智能技术生成

进程

就是正在运行的程序。也就是代表了程序锁占用的内存区域。

特点
**独立性:**进程是系统中独立存在的实体,它可以拥有自己的独立的资源,每一个进程都拥有自己私有的地址空间。在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。
**动态性:**进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念,进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。
**并发性:**多个进程可以在单个处理器上并发执行,多个进程之间不会互相影响。

线程

线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程可以开启多个线程。
多线程扩展了多进程的概念,使得同一个进程可以同时并发处理多个任务。简而言之,一个程序运行后至少一个进程,一个进程里包含多个线程。如果一个进程只有一个线程,这种程序被称为单线程。如果一个进程中有多条执行路径被称为多线程程序
在这里插入图片描述

线程创建方式

在这里插入图片描述

继承Thread类

Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。Start()方法是一个native方法,它将通知底层操作系统,最终由操作系统启动一个新线程,操作系统将执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。
步骤
(1)创建线程类去继承Thread类
(2)重写Thread类的run方法,run方法中编写需要完成的任务
(3)创建线程类对象
(4)调用start方法启动线程
创建对象
Thread()//分配新的 Thread 对象。
Thread(String name)//分配新的 Thread 对象。
Thread(Runnable target)//分配新的 Thread 对象。
Thread(Runnable target,String name)//分配新的 Thread 对象。
常用方法

返回值 方法名 描述
long getId() 返回该线程的标识符。
String getName() 返回该线程的名称。
void run() 如果该线程是使用独立的 Runnable 运行对象构造的,
则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
void setName(String name) 改变线程名称,使之与参数 name 相同。
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),
void start() 使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
void stop() 终止线程。
代码演示

//测试  Thread类
public class Test_Thread {
   
    public static void main(String[] args) {
   
        // 1,创建对象
        MyThread t = new MyThread();// 新建状态
        // 2,开启线程
        // t.run();
        t.setName("线程1");// 修改线程名
        t.start();// 可运行状态
        // 3,run()和start()有什么区别?
        // run()和start()都能执行任务,但是run()执行时就只是一个普通的方法调用没有多线程并发抢占的效果
        // --模拟多线程--
        MyThread t2 = new MyThread();
        // t2.run();
        t2.setName("线程2");// 修改线程名
        t2.start();
        //4,多线程的执行结果具有随机性 
    }
}
// 1,继承Thread类,实现多线程编程
class MyThread extends Thread {
   
    // 2,在多线程编程里,把所有的业务放入--重写的run()里--generate--override methods..
    // --需求:重复的打印10次线程名称
    @Override
    public void run() {
   // 运行状态
        for (int i = 0; i < 10; i++) {
   // fori
            System.out.println(super.getName() + "---" + i);// getName()--获取线程名称
        }
    }// 结束状态
}
线程1---0
线程2---0
线程2---1
线程2---2
线程2---3
线程2---4
线程1---1
线程1---2
线程1---3
线程1---4
线程1---5
线程1---6
线程1---7
线程1---8
线程1---9
线程2---5
线程2---6
线程2---7
线程2---8
线程2---9

实现Runnable接口

Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run。使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中断。
步骤
(1)创建线程类实现Runnable接口
(2)线程类中实现Runnable接口的run方法
(3)通过Thread类创建线程对象。
(4)将Runnable接口的实现类对象作为实际参数传递给Thread类的构造器中。
(5)调用Thread类的start()方法启动线程
方法
void run()//使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法。
代码演示

//测试 Runnable接口
public class Test_Runnable {
   
    public static void main(String[] args) {
   
        // 1,创建目标对象
        MyRunnable target = new MyRunnable(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值