Java创建线程的四种方法

四种方法包括:实现Runnable接口实现run ()方法、继承Thread类重写run()方法、实现Callable接口实现call()方法、由线程池通过submit() | execute() 方法创建

Java创建线程的四种方法

1. 实现Runnable接口

创建一个类实现Runnable接口,实现run()方法

1
2
3
4
5
6
public class MyThread1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}

实例化一个该类的对象传入Thread()构造方法,通过创建的thread对象调用start()方法就开启了该线程

1
2
3
4
public static void main(String[] args) throws ExecutionException, InterruptedException {
Thread thread1 = new Thread(new MyThread1());
thread1.start();
}

2. 继承Thread

创建一个类继承Thread类,重写run()方法

1
2
3
4
5
6
public class MyThread2 extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}

实例化一个该类的对象传入Thread()构造方法,通过创建的thread对象调用start()方法就开启了该线程

1
2
3
4
public static void main(String[] args) throws ExecutionException, InterruptedException {
Thread thread2 = new Thread(new MyThread2());
thread2.start();
}

3.实现 Callable接口

创建一个类实现Callable接口,实现call()方法

call()方法是有返回值的,所以这种方法用来创建有返回值的线程

1
2
3
4
5
6
7
public class MyThread3 implements Callable {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName());
return "Hello World";
}
}

实例化一个该类的对象传入FutureTask<>()构造方法,创建一个FutureTask<>类型的对象,将该对象传入Thread()构造方法,调用start()方法就开启了该线程(泛型是返回值的类型)

通过上面创建的FutureTask<>类型的对象调用get()方法可以拿到call()的返回值

1
2
3
4
5
6
7
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> futureTask = new FutureTask<String>(new MyThread3());
Thread thread3 = new Thread(futureTask);
thread3.start();
String s = futureTask.get();
System.out.println(s);
}

4.线程池

线程池的工作流程:

​ 当新的任务来到线程池

  1. 如果此时线程池中线程数少于corePoolSize,就会创建新的核心线程执行该任务即使有空闲的核心线程
  2. 如果此时线程池中线程数等于corePoolSize,并且没有空闲核心线程,新的任务就会加入任务队列等待(如果有空闲核心线程就会让空闲核心线程执行吗?)
  3. 如果任务队列已满,但是线程数还没有达到maximumPoolSize,就会创建新的临时线程来执行该任务
  4. 如果线程数量已达最大线程数,并且任务队列已满,新的任务就会被拒绝,并由RejectedExecutionHandler处理

​ 一个任务被执行完成后,就会从任务队列中拉取下一个任务来执行,核心线程会永久存活,临时线程空闲超过存活时间就会被释放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
100, //corePoolSize
200, //maximumPoolSize
60, //keepAliveTime
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(100)
);
threadPoolExecutor.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
Future<String> submit = threadPoolExecutor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName());
return "HelloWorld";
}
});
String s = submit.get();
System.out.println(s);
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!