创建线程的方式

创建线程的方式

1、Thread类构造方法

1
2
3
4
// Thread类源码
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals)
JAVA
1
2
3
4
5
6
7
我们解释在初始化方法中的参数:
ThreadGroup g 线程组,指定这个线程是在哪个线程组下
Runnable target 指定要执行的任务
String name 线程的名字,多个线程的名字是可以重复的。

AccessControlContext acc 用于初始化变量inheritedAccessControlContext
boolean inheritThreadLocals 可继承的ThreadLocal
MARKDOWN

2、继承Thread

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("Thread方法");
for (int i = 0;i<10;i++) {
System.out.println("Thread方法" + i);
}
}
}

public class Thread1 {

public static void main(String[] args) {
//1、 创建线程
ThreadDemo threadDemo = new ThreadDemo();
//2、 线程开始执行,调用的不是run()方法,而是start()方法
//如果调用run方法相当于在主线程中执行
//注意不可多次调用start()方法。在第一次调用start()方法后,再次调用start()方法会抛出异常
threadDemo.start();
}
}
JAVA

3、 实现Runnable

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class ThreadDemo2 implements Runnable{
@Override
public void run() {
System.out.println("Thread方法");
for (int i = 0;i<10;i++) {
System.out.println("Thread方法" + i);
}
}
}

public class Thread2 {
public static void main(String[] args) {
ThreadDemo2 threadDemo2 = new ThreadDemo2();
Thread thread = new Thread(threadDemo2);

thread.start();
}
}
JAVA

4、 实现callable

1
2
3
实现callable接口,重写call()方法,将所要完成的代码写进call()方法中,需要注意的是call()方法有返回值,并且可以抛出异常

如果想要获取运行该线程后的返回值,需要创建Future接口的实现类的对象,即FutureTask类对象,调用该对象的get()方法可获取call()方法的返回值。
MARKDOWN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class ThreadDemo3 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("ThreadDemo3.call");
return 1;
}
}

public class Thread3 {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建FutureTask的对象
FutureTask<Integer> FutureTask = new FutureTask<>(new ThreadDemo3());
//创建Thread类的对象
Thread thread = new Thread(FutureTask);
//线程执行
thread.start();
//获取返回值
System.out.println(FutureTask.get());
}
}
JAVA

5、 通过线程池

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
class ThreadDemo4 implements Runnable{
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"正在被执行");
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}


public class Thread4 {
public static void main(String[] args) {
//实现Runnable接口
ThreadDemo4 threadDemo4 = new ThreadDemo4();
//创建单线程线程池
ExecutorService executor = Executors.newSingleThreadExecutor();

for (int i = 0; i < 10; i++) {
//线程执行
executor.execute(threadDemo4);
}
}
}
JAVA

6、 继承Thread类和实现Runnable接口的比较

1
2
# 两者之间没有本质的区别
唯一的区别就是类和接口的区别
MARKDOWN

创建线程的方式
https://johnjoyjzw.github.io/2020/10/05/创建线程的方式/
Author
John Joy
Posted on
October 5, 2020
Licensed under