Java多线程的实现方式
继承Thread,重写里面run方法,创建实例,执行start
优点:代码编写简单
缺点:没有返回值,继承一个类后,没办法继承其他类,拓展性较差
public class ThreadDemo extends Thread{
@Override
public void run() {
System.out.println("继承Thread 重写run方法"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
ThreadDemo demo = new ThreadDemo();
demo.setName("llll");
demo.start();
}
自定义类实现Runnable,实现里面run方法,创建Thread类,使用Runnable接口的实现对象作为参数
传递给Thread对象,调用Start接口
优点:线程类可以实现多个接口,可以在继承一个类
缺点:没有返回值,不能直接启动,需要通过狗在一个Thread实例传递进去启动
public class ThreadDemo2 implements Runnable{
@Override
public void run() {
System.out.println("实现Runnable接口");
}
}
public static void main(String[] args) {
ThreadDemo2 demo2 = new ThreadDemo2();
Runnable target;
Thread thread = new Thread(demo2);
thread.start();
}
创建callable接口的实现类,并实现call方法,结合FutureTask类包装Callable对象,实现多线程
优点:有返回值 拓展性高
缺点:JDK5之后才支持,需要重写call方法,结合多个类例如FutureTask和Thread类
public class MyTask<Object> implements Callable {
@Override
public Object call() throws Exception {
System.out.println("Callable"+Thread.currentThread().getName());
return (Object) "有返回值";
}
}
public class main1 {
public static void main(String[] args) {
MyTask myTask = new MyTask();
FutureTask<Object> futureTask = new FutureTask<>(myTask);
Thread thread = new Thread(futureTask);
thread.setName("llll");
thread.start();
}
}
自定义Runnable接口,实现run方法,创建线程池,调用执行方法并传入对象
优点:安全高性能,复用线程
缺点: jdk5后才支持,需要结合Runnable进行使用
public class ThreadDemo4 implements Runnable {
@Override
public void run() {
System.out.println("通过线程池+runnable实现多线程,名称:"+Thread.currentThread().getName());
}
}
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for(int i=0;i<10;i++){
executorService.execute(new ThreadDemo4());
}
System.out.println("主线程名称:"+Thread.currentThread().getName());
executorService.shutdown();
}