前言
本文介绍创建多线程的四种方式:
①继承Thread类。
②实现Runnable接口。
③实现Callable接口,该接口需要传入泛型,泛型的类型就是线程执行完毕需要返回的值的类型。
④使用线程池(线程池的操作就花里胡哨了,我这里就拿newFixedThreadPool来做例子)
一、继承Thread类
由于Thread类实现了Runnable接口,所以我们需要重写的是run( )方法
/**
* @author 弹弹霹雳
* @create 2020-11-24-0:36
*/
public class TestThread {
public static void main(String[] args) {
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
}
}
class ThreadDemo extends Thread {
@Override
public void run() {
int sum = 0;
for(int i = 1; i <= 10; i++){
sum += i;
}
System.out.println("sum = " + sum);
}
}
//运行结果:sum = 55
二、实现Runnable接口
编写一个类,实现Runnable接口,实现run( )方法
/**
* @author 弹弹霹雳
* @create 2020-11-24-0:46
*/
public class TestRunnable {
public static void main(String[] args) {
RunnableDemo runnableDemo = new RunnableDemo();
new Thread(runnableDemo).start();
}
}
class RunnableDemo implements Runnable{
@Override
public void run() {
int sum = 0;
for(int i = 1; i <= 10; i++){
sum += i;
}
System.out.println("sum = " + sum);
}
}
//运行结果:sum = 55
三、实现Callable接口
如果线程需要返回值,就可以实现Callable接口。泛型T就是我们希望线程返回的值的类型
该接口的实现类需要重写call方法,之后需要通过FutureTask包装该实现类的对象,最后可以通过FutrueTask的get( )方法来获取线程的返回值。如果线程未执行完毕,那么调用get( ) 方法的线程就会被阻塞,直到该线程返回值后才通行。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* @author 弹弹霹雳
* @create 2020-11-24-0:50
*/
public class TestCallable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
CallableDemo callableDemo = new CallableDemo();
//创建FutureTast包装CallableDemo
FutureTask task = new FutureTask<>(callableDemo);
//新建一个线程并执行
new Thread(task).start();
//获取线程运行的结果,如果线程未执行完毕,那么该处会阻塞,直到等待的线程返回值
int sum = task.get();
System.out.println("sum = " + sum);
}
}
class CallableDemo implements Callable{
@Override
public Integer call() throws Exception {
int sum = 0;
for(int i = 1; i <= 10; i++){
sum += i;
}
return sum;
}
}
//运行结果:sum = 55
四、使用线程池(newFixedThreadPool)
newFixedThreadPool:固定线程池,其核心线程数和最大线程数固定相等
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author 弹弹霹雳
* @create 2020-11-24-1:05
*/
public class TestThreadPool {
public static void main(String[] args) {
ThreadPoolDemo demo = new ThreadPoolDemo();
//该线程池最大允许3个线程并发进行
ExecutorService pool = Executors.newFixedThreadPool(3);
//执行线程
pool.execute(demo);
//关闭线程池
pool.shutdown();
}
}
class ThreadPoolDemo implements Runnable{
@Override
public void run() {
int sum = 0;
for(int i = 1; i <= 10; i++){
sum += i;
}
System.out.println("sum = " + sum);
}
}
//运行结果:sum = 55
本文分享 CSDN - 弹弹霹雳。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。