内容
前言
1。继承Thread并重写run方法
2。实现Runnable接口并重写run方法
3。使用匿名内部类创建Thread子类对象
4。使用匿名内部类实现Runnable接口
5。 Lambda 表达式
6。实现 Callable 接口
7。使用线程池创建线程
这是一道基本的面试题,你一定能答对哦~
创建一个线程,方法是自定义一个类(这里命名为:MyThread),继承Thread类,重写run方法,最后在main方法中创建一个新的MyThread实例,并调用this的继承Thread类的start方法实例。 。
Ps:
1。创建MyThread实例并不意味着系统中实际创建了一个线程。只有当start方法被调用时,才会创建一个新的线程。新线程会执行run中的逻辑,直到run中的逻辑执行完毕。 ,线程结束;
?主线程和MyThread创建的新线程是“并发执行”关系(并发+并行),也可以理解为同时执行,各自执行自己的;3。直接调用run并不会创建线程,只是执行原线程中的代码;
代码如下:
class MyThread extends Thread {@Overridepublic void run() {System.out.println("继承Thread,重写run方法创建线程");}undefinedpublic class Main {public static void main(String[] args) {Thread thread = new Thread() {@Overridepublic void run() {System.out.println("使用匿名内部类创建Thread子类对象" );}};线程.start();}
}
4。使用匿名内部类实现Runnable接口
通过使用匿名内部类,实现Runnable接口作为Thread构造方法的参数,最终通过start创建并启动线程;
代码如下:
public class Main {public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("使用匿名内部类,实例Runnable接口作为构造参数");}});thread.start();}
}
5。 Lambda 表达式
Lambda本质上是一个“匿名函数”,()代表函数的形参,{}代表函数体,->特殊语法,表明它是一个lambda表达式(->是从C++复制过来的)。
代码如下:
public class Main {public static void main(String[] args) {Thread thread = new Thread(() -> {System.out.println("使用lambda创建线程");});thread.开始();}}
6.实现Callable接口
undefined}public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {FutureTask任务 = new FutureTask<>(new MyCallableTest());Thread 线程 = new Thread(task);thread.start ();System.out.println("创建线程的返回结果为:" + task.get());}}
在Java中,线程池的本体称为ThreadPoolExecutor。它的构造方法写起来很麻烦。为了简化构造方法,标准库提供了一系列工厂方法来简化使用;
什么是工厂模式?
创建产品实例的权利转移给工厂。我们不再使用new来创建我们需要的对象,而是使用工厂来获取我们需要的产品。减少产品使用者与用户之间的耦合关系;
也就是说,这里创建线程池没有显式new,而是通过Executors的静态方法newCaChedThreadPool;
?常用:
代码如下:
导入java.util.concurrent.ExecutorService;导入 java.util.concurrent.Executors;public class Pool {public static void main(String[] args) {ExecutorService pool = Executors.newCachedThreadPool();pool.submit(new Runnable() {@Overridepublic void run() {/ /执行业务逻辑 for(int i = 1; i <= 100; i++) {System.out.println("Thread:" + Thread.currentThread().getName() + "任务已执行" + i + "~ " );}}});pool.submit(new Runnable() {@Overridepublic void run() {//执行业务逻辑 for(int i = 101; i <= 200; i++) {System.out.println( " Thread:" + Thread.currentThread().getName() + "任务已执行" + i + "~");}}});pool.submit(new Runnable() {@Overridepublic void run() {//执行业务逻辑 for(int i = 201; i <= 300; i++) { System.out.println("Thread:" + Thread.currentThread().getName() + "任务已执行" + i + "~ "); }}});}
}
当任务量达到一定程度,一个线程太忙时,你会发现其他线程来帮忙~