Java基础——多线程(一)

概念

线程和进程

进程:进程是程序的基本执行实体

线程:线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程的实际运作单位

简单理解:应用软件中互相独立,可以同时运行的功能。多线程可以让程序同时做多件事情,提高效率。

应用场景:软件中的耗时操作(拷贝、迁移大文件,加载大量的资源),所有的聊天软件,所有的后台服务器

并发和并行

并发:在同一时刻,有多个指令在单个CPU上交替执行(单个CPU在多个线程之间交替执行)

并行:在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

继承Tread类的方式进行

Thread类表示线程

1、自己定义一个类继承Thread

2、重写run方法

3、创建子类的对象,并启动线程(用start方法)

java 复制代码
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "HelloWorld");
        }
    }
}
java 复制代码
public class ThreadDemo {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();

        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();
        t2.start();
    }
}

实现Runnable接口的方式进行实现

1、自己定义一个类实现Runnable接口

2、重写里面的run方法

3、创建自己的类的对象

4、创建一个Thread类的对象,并开启线程

java 复制代码
public class MyRun implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            //获取当前线程的对象(哪条线程执行到这个方法,此时获取的就是哪条线程的对象)
            Thread t = Thread.currentThread();

            System.out.println(t.getName()+"HelloWorld");
        }
    }
}
java 复制代码
public class ThreadDemo {
    public static void main(String[] args) {
        MyRun mr = new MyRun();//创建MyRun对象表示多线程要执行的任务

        Thread t1 = new Thread(mr);//创建线程对象
        Thread t2 = new Thread(mr);
        t1.setName("线程1");
        t2.setName("线程2");

        t1.start();//开启线程
        t2.start();
    }
}

利用Callable接口和Future接口方式实现

特点:可以获取到多线程运行的结果

1、创建一个类MyCallable实现Callable接口

2、在类中重写call(是有返回值的,表示多线程运行的结果)

3、创建MyCallable对象(表示多线程要执行的任务)

4、创建FutureTask的对象(作用管理多线程运行的结果)

5、创建Thread类的对象,并启动(表示线程)

java 复制代码
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        //求1~100之和
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            sum+=i;
        }
        return sum;
    }
}
java 复制代码
public class ThreadDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建MyCallable对象(表示多线程要执行的任务)
        MyCallable mc = new MyCallable();
        //创建FutureTask的对象(作用管理多线程运行的结果)
        FutureTask<Integer> ft = new FutureTask<>(mc);
        //创建线程对象
        Thread t1 = new Thread(ft);
        //启动线程
        t1.start();
        //获取多线程运行的结果
        Integer result = ft.get();
        System.out.println(result);
    }
}

总结

常见的成员方法(Thread类)

setName方法:

1、如果没有给线程设置名字,线程也是有默认名字的,格式:Thread-X(X序号,从0开始)

2、如果我们要给线程设置名字,可以用set方法进行设置,也可以用构造方法设置
currentThread方法:

获取当前线程的对象,哪条线程执行到这个方法,此时获取的就是哪条线程的对象

当JVM虚拟机启动后,会自动启动多条线程其中有一条线程叫main线程,它的作用是调用main方法,并执行里面的代码
sleep方法:

1、哪条线程直行到这个方法,那么哪条线程就会在这里停留对应的时间

2、方法的参数:表示睡眠的时间,单位毫秒

线程优先级

Java中采用抢占式调度(随机):

哪条线程抢夺到执行权,就执行哪条线程

一条线程在执行过程中随时可能被其它线程抢夺走执行权,也就是说它可能还没运行完就被其他线程挤占掉,进入就绪状态

Thread类中的成员方法:

优先级高的优先运行的概率大(是概率不是一定)

守护线程

final void setDaemon(boolean on) 设置为守护线程(参数为true)

细节:当其它的非守护线程执行完毕之后,守护线程会陆续结束(注意不一定是立即结束)

礼让线程

public static void yield() 出让线程/礼让线程

Java中采用抢占式调度(随机),此方法可以让不同线程尽量均匀调度(不是一定,是尽量)

插入线程

public static void join() 插入线程

作用:把方法调用者的这个线程插入到当前线程(参数)之前

线程的生命周期

线程的状态

没有运行状态:线程运行时交给CPU,不归Java管

相关推荐
《源码好优多》3 分钟前
基于Java Springboot旅游信息推荐系统
java·spring boot·旅游
岁月无声code5 分钟前
Spring Boot 牛刀小试 org.springframework.boot:spring-boot-maven-plugin:找不到类错误
java·spring boot·github
不爱学习的YY酱17 分钟前
【计网不挂科】计算机网络第二章< 物理层 >习题库(含答案)
java·数据库·计算机网络
一丝晨光25 分钟前
gcc 1.c和g++ 1.c编译阶段有什么区别?如何知道g++编译默认会定义_GNU_SOURCE?
c语言·开发语言·c++·gnu·clang·gcc·g++
南城花随雪。36 分钟前
Spring框架之装饰者模式 (Decorator Pattern)
java·开发语言·装饰器模式
编程、小哥哥40 分钟前
设计模式之装饰器模式(SSO单点登录功能扩展,增加拦截用户访问方法范围场景)
java·设计模式·装饰器模式
究极无敌暴龙战神X41 分钟前
前端学习之ES6+
开发语言·javascript·ecmascript
虞书欣的61 小时前
Python小游戏24——小恐龙躲避游戏
开发语言·python·游戏·小程序·pygame
FHYAAAX1 小时前
【机器学习】任务十:从函数分析到机器学习应用与BP神经网络
开发语言·python
汉克老师1 小时前
GESP4级考试语法知识(贪心算法(四))
开发语言·c++·算法·贪心算法·图论·1024程序员节