Java多线程实现的几种方式
# Java多线程实现的几种方式
多进程是计算机中的一个重要概念,通常一个任务称为一个进程,比如浏览网页、播放音乐都是一个进程。
在进程内部可能还需要执行多个子任务,比如在使用word文档打字的时候,不仅要进行字符打印,同时还要进行字符统计、拼接检查等任务。
进程和线程的关系是:一个进程可以包含一个或者多个线程,但至少会包含一个线程。
在Java中,多线程的学习是非常重要的,本文主要概括Java多线程实现的几种方式。
Java中实现多进程的方式大概有3种:
- 实现Runnable接口,重写run方法
- 继承Thread类,重写run方法(Thread类本身也实现了Runnable接口)
- 实现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
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
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
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
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
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
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)
上次更新: 2023/05/13, 18:05:21
- 01
- SpringCache基本配置类05-16
- 03
- Rpamis-security-原理解析12-13