benym的知识笔记 benym的知识笔记
🦮首页
  • Java

    • Java-基础
    • Java-集合
    • Java-多线程与并发
    • Java-JVM
    • Java-IO
  • Python

    • Python-基础
    • Python-机器学习
  • Kafka
  • Redis
  • MySQL
  • 分布式事务
  • Spring

    • SpringIOC
    • SpringAOP
🦌设计模式
  • 剑指Offer
  • LeetCode
  • 排序算法
🐧实践
  • Rpamis

    • Utils
    • Exception
    • Security
  • 归档
  • 标签
  • 目录
🦉里程碑
🐷关于
GitHub (opens new window)

benym

惟其艰难,才更显勇毅🍂惟其笃行,才弥足珍贵
🦮首页
  • Java

    • Java-基础
    • Java-集合
    • Java-多线程与并发
    • Java-JVM
    • Java-IO
  • Python

    • Python-基础
    • Python-机器学习
  • Kafka
  • Redis
  • MySQL
  • 分布式事务
  • Spring

    • SpringIOC
    • SpringAOP
🦌设计模式
  • 剑指Offer
  • LeetCode
  • 排序算法
🐧实践
  • Rpamis

    • Utils
    • Exception
    • Security
  • 归档
  • 标签
  • 目录
🦉里程碑
🐷关于
GitHub (opens new window)
  • Java-基础

    • Java反射获取类对象的三种方式
    • 动态代理
  • Java-集合

    • ArrayList的扩容机制
  • Java-多线程与并发

    • Java多线程实现的几种方式
      • Java多线程实现的几种方式
        • 通过Runnable接口实现多线程
        • 通过继承Thread类实现
        • 通过继承Callable接口实现
    • 多线程交替打印数字—多种实现
    • CountDownLatch使用方法
    • CyclicBarrier使用方法
    • Semaphore使用方法
    • CompletableFuture常用用法及踩坑
  • Java-JVM

    • 自定义类加载器
    • JMH-基准测试框架
  • Java-IO

    • 概览
  • Java
  • Java-多线程与并发
benym
2020-06-28
目录

Java多线程实现的几种方式

# Java多线程实现的几种方式

多进程是计算机中的一个重要概念,通常一个任务称为一个进程,比如浏览网页、播放音乐都是一个进程。

在进程内部可能还需要执行多个子任务,比如在使用word文档打字的时候,不仅要进行字符打印,同时还要进行字符统计、拼接检查等任务。

进程和线程的关系是:一个进程可以包含一个或者多个线程,但至少会包含一个线程。

在Java中,多线程的学习是非常重要的,本文主要概括Java多线程实现的几种方式。

Java中实现多进程的方式大概有3种:

  1. 实现Runnable接口,重写run方法
  2. 继承Thread类,重写run方法(Thread类本身也实现了Runnable接口)
  3. 实现Callable接口,重写call方法(带有返回值)

# 通过Runnable接口实现多线程

public class Main {
    public static void main(String[] args) {
        Thread t = new Thread(new MyRunnable());
        t.start(); // 启动新线程
    }
}

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("start new thread!");
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14

实现Runnable接口的类,只定义了任务,自身不具有线程能力。需要通过Thread类的构造器来将任务驱动在一个线程中。

# 通过继承Thread类实现

Thread类中已经实现了Runnable接口,所以可以直接继承Thread类,覆写run方法实现多线程

public class MyThread extends Thread{
    public void run(){
        System.out.println("New Thread : "+Thread.currentThread().getName());
    }
    public static void main (String []args){
        MyThread thread = new MyThread();
        thread.start();
        System.out.println("Main Thread : " + Thread.currentThread().getName());
    }
}
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

# 通过继承Callable接口实现

相较于实现Runnable接口,Callable方法可以有返回值,并且可以抛出异常

执行Callable方法,需要FutureTask实现类的支持,用于接受运算的结果,FutureTask是Future接口的实现

需要覆写call方法,运行Callable任务可以拿到一个Future对象,Future表示异步计算的结果

通过Future对象可了解任务执行情况,可取消任务的执行,还可以获取任务执行的结果

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class TestCallable {

    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();

        FutureTask<Integer> result = new FutureTask<>(td);

        new Thread(result).start();

        try {
            Integer sum = result.get();
            System.out.println(sum);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }

}

class ThreadDemo implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        int sum = 0;

        for (int i = 0; i <= 100; i++) {
            sum += i;
        }

        return sum;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
编辑 (opens new window)
#多线程#Java
上次更新: 2023/05/13, 18:05:21
ArrayList的扩容机制
多线程交替打印数字—多种实现

← ArrayList的扩容机制 多线程交替打印数字—多种实现→

最近更新
01
SpringCache基本配置类
05-16
02
DSTransactional与Transactional事务混用死锁场景分析
03-04
03
Rpamis-security-原理解析
12-13
更多文章>
Theme by Vdoing | Copyright © 2018-2024 benym | MIT License
 |   |   | 
渝ICP备18012574号 | 渝公网安备50010902502537号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式