1-继承Thread类创建线程
通过继承Thread类来创建线程,需要重写run方法来定义线程的执行逻辑。然后通过创建Thread的子类的实例并调用start方法来启动线程。缺点:类只能继承一个类,继承实现扩展性不好。
class MyThread extends Thread {
@Override
public void run() {
// 线程执行的代码逻辑
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}
2-实现Runnable接口创建线程
创建一个实现Runnable接口的类,并实现其run方法。然后,创建Thread对象,将Runnable对象作为参数传递给Thread构造函数,并调用start方法启动线程。
class MyRunnable implements Runnable {
public void run() {
// 线程执行的代码逻辑
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
}
3-实现Callable接口创建线程
Runnable 接口run方法没有返回值;
Callable接口call方法有返回值,是个泛型,
和Future、FutureTask配合可以用来获取异步执行的结果
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("正在运行");
//返回值
return "OK";
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
// 创建Callable接口实现类MyCallable的对象
MyCallable mycallable = new MyCallable() ;
// 将此Callable接口实现类的对象mc作为参数
//传递到FutureTask构造器中,创建FutureTask的对象
FutureTask<String> futuretack = new FutureTask<String>(mycallable) ;
// 创建Thread对象
Thread thread = new Thread(futuretack) ;
// 调用start方法启动线程
thread.start();
// 调用ft的get方法获取执行结果
String result = futuretack.get();
// 输出返回结果
System.out.println(result);
}
}
4-使用线程池创建线程
public class MyExecutors implements Runnable{
@Override
public void run() {
System.out.println("线程池创建线程");
}
public static void main(String[] args) {
//创建一个自定义线程池,最多同时执行3个线程
ExecutorService threadPool = Executors.newFixedThreadPool(3);
//线程池提交任务执行
threadPool.submit(new MyExecutors()) ;
// 关闭线程池
threadPool.shutdown();
}
}