多线程编程

本文介绍了多线程的概念,包括进程、线程和多线程的基本概念。接着详细阐述了多线程的运行原理,即CPU通过快速切换执行多个进程,使得程序看似并行运行。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。文章详细列举了这两种方式的实现步骤,并对比了它们之间的区别,强调了实现Runnable接口在解耦线程任务和线程对象方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程概述:

进程:进程是处于运行过程中的程序,并且具有一定独立功能。

线程:线程是进程中的一个执行单元,负责当前进程中程序的执行。

多线程:一个程序中有多个线程在同时执行

一个程序运行后至少有一个进程,一个进程中可以包含多个线程,但至少有一个线程。

多线程运行原理:

CPU(中央处理器)做着高速的切换,对于CPU而言,它在某一时刻,只能执行一个程序,即只能运行一个进程,CPU不断地在这些进程之间切换。但因CPU的执行速度相对我们的感知实在太快,我们则感觉多个进程在同时执行。

实现多线程:

在java中实现多线程,有三种方式,继承Thread类,实现Runable接口,实现Callable接口

继承Thread类:

创建线程的步骤:

1. 定义一个类继承Thread 

2. 重写run方法

3. 创建子类对象,也就是创建线程对象

4. 调用start()方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法。

package class26day;

public class TestThread extends Thread {//继承Thread
    public static void main(String[] args) {
        TestThread myTestThread =  new TestThread("分支");//new一个线程对象,构造函数给线程重命名
        TestThread myTestThread1 =  new TestThread("2号分支");//new一个线程对象,构造函数给线程重命名
        myTestThread.start();//开启线程
        myTestThread1.start();//开启线程
        currentThread().setName("主线程");
        for (int i = 0; i < 1000; i++) {
            System.out.printf("这是%s独立线程%s\n",currentThread().getName(),i);
        }
    }
    //重写Thread的run方法
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.printf("这是%s独立线程%d\n",currentThread().getName(),i);
        }
    }
    public TestThread() {}//无参构造函数
    public TestThread(String name) {
        super(name);//线程重命名构造函数
    }
}

Thread.currentThread()获取当前线程对象

Thread.currentThread().getName();获取当前线程对象的名称

线程对象调用run()方法不开启线程。仅是对象调用方法。

线程对象调用start()开启线程,并让jvm调用run方法在开启的线程中执行。

实现Runable接口:

创建线程的步骤:

1. 定义类实现Runnable接口。

2. 覆盖接口中的run方法。

3. 创建Thread类的对象。

4. 将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

5. 调用Thread类的start方法开启线程。

package class26day;

public class TestRunnable implements Runnable {
    private String name;
    TestRunnable(String name){
        this.name = name;
    }
    //重写Thread的run方法
    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.printf("这是%s的%s独立线程%d\n",name,Thread.currentThread().getName(),i);
        }
    }

    public static void main(String[] args) {
        //创建Runnable子类的对象。注意它并不是线程对象
        TestRunnable T = new TestRunnable("TestRunnable");
        //创建Thread类的对象,将Runnable接口的子类对象作为参数传递给Thread类的构造函数
        Thread t1 = new Thread(T);
        t1.setName("线程1号");
        Thread t2 = new Thread(T);
        t2.setName("线程2号");
        //线程启动
        t1.start();
        t2.start();
        System.out.println(Thread.currentThread().getName()+"主线程");
    }
}

Thread和Runnable的区别

实现Runnable接口相比继承Thread类的优势:

1:实现Runnable接口避免了单继承的局限性

2:适合多个相同的程序代码的线程处理同一资源

3:继承Thread类,线程对象和线程任务耦合在一起。一旦创建Thread类的子类对象,既是线程对象,有又有线程任务。实现runnable接口,将线程任务单独分离出来封装成对象,类型就是Runnable接口类型。Runnable接口对线程对象和线程任务进行解耦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值