1. 继承Thread对象重写run方法
注意,针对MyThread实例我们可以调用run方法和start方法,这两种方法是有很大区别的;run方法作用是直接在当前线程执行重写的run方法里面的代码,跟直接调用一个实例方法没什么两样。而start方法作用是创建一个线程,等待CUP分配给新创建的线程,分配到后再执行run方法。因此我们想创建一个新线程来执行业务逻辑就必须调用start方法。
public class HowCanCreateThread extends Thread{
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
class MyThread extends Thread {
@Override
public void run() {
System.out.println("自定义线程逻辑");
}
}
2. 实现Runnable接口
一般情况下我们都是偏向于使用实现Runnable接口的方式进行线程创建;因为这种方式能够将的执行逻辑,也就是run方法里面的业务内容和Thread类进行分开,有利于解耦;同时由于Java单继承的特性,继承也是一种宝贵的资源,我们的业务类去继承了Thread类就不能去继承其他类了,降低了扩展性。
public class HowCanCreateThread extends Thread{
public static void main(String[] args) {
Runnable runnable = new MyRunnable();
Thread threadByRunnable = new Thread(runnable);
threadByRunnable.start();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("自定义线程逻辑");
}
}
3. 实现Callable接口(带返回值)
public class HowCanCreateThread extends Thread{
public static void main(String[] args) {
// 1.创建Callable接口实现类
Callable<String> callable = new MyCallable();
// 2.创建FutureTask传入callable实例,接收callable返回值
FutureTask<String> futureTask = new FutureTask<>(callable);
// 3.创建Thread传入futureTask实例,启动start方法
Thread threadByCallable = new Thread(futureTask);
threadByCallable.start();
// 4.获取返回值
try {
System.out.println( futureTask.get() );
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
class MyCallable implements Callable<String> {
@Override
public String call() {
return "带执行返回值的线程逻辑";
}
}
4. 使用线程池
public class HowCanCreateThread extends Thread{
public static void main(String[] args) {
Runnable runnable = new MyRunnable();
// 创建五个固定数量线程的线程池
ExecutorService executorByNoResult = Executors.newFixedThreadPool(5);
// 提交runnable到线程池中进行执行
executorByNoResult.submit(runnable);
// 执行完毕关闭线程池
executorByNoResult.shutdown();
}
}
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程逻辑");
}
}
补充: 下面几个核心类的学习是对灵活掌握多线程编程是很重要的, 有时间请自行去扩展吧😀
/**
* 核心类的学习:
* Thread
* FutureTask
* Future
* ExecutorService
* Executors
*/