JAVA中通过继承Thread类、实现Runnable接口以及实现Callable接口配合Future接口实现创建多线程,三种方式各有优缺点,而第三种则具备更多的增强能力
需要注意的是,本节没有讨论线程池的应用,仅针对单个线程的创建方式。
/**
* 通过继承Thread类实现多线程
*/
public class MyThread extends Thread {
public MyThread() {
System.out.println("构造!调用线程名:"+Thread.currentThread().getName());
}
@Override
public void run() {
System.out.println("线程启动了!本线程名:"+getName());
for(int i=0;i<100;i++){
System.out.println(getName()+"++"+ i);
}
}
// 测试代码
public static void main(String[] args)
{
// 直接创建自定的继承类
new MyThread().start();
new MyThread().start();
}
}
/**
* 通过实现Runnable接口创建线程类
*/
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("线程启动了!");
}
// 测试代码
public static void main(String[] args)
{
// 直接运行
new Thread(new MyRunnable()).start();
// 想获取当前线程的信息
Thread thread = new Thread(new MyRunnable());
thread.start();
System.out.println("线程启动了!线程的名字;"+thread.getName());
// 匿名内部类写法
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("匿名内部类线程启动了!");
}
}).start();
// JDK1.8 lambda写法
new Thread(() -> {
System.out.println("lambda写法匿名内部类线程启动了");
}).start();
}
}
/**
* 实现Callable接口配合Future创建线程
*/
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(5000);
System.out.println("子线程名:"+Thread.currentThread().getName());
return "返回值1";
}
// 测试代码
public static void main(String[] args)
{
MyCallable myCallable = new MyCallable();
// FutureTask能用来包装一个Callable或Runnable对象,因为它实现了Runnable接口,而且它能被传递到Executor进行执行
// RunnableFuture接口同时继承Future接口和Runnable接口,在执行run()方法后,可以通过Future访问执行结果,实现类是FutureTask
FutureTask<String> task = new FutureTask<String>(myCallable);
new Thread(task).start();
try {
//取消任务
//task.cancel(true);
//完成状态
//task.isDone();
//取消状态
//System.out.println("子线程的取消了吗:"+task.isCancelled());
System.out.println("子线程的返回值:"+task.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
优点:
缺点:
优点:
缺点:
Callable 方案(JDK1.5)可以理解为是 Runnable 的增强版。
区别如下:
提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
可以了解任务执行情况,可取消任务的执行,还可获取执行结果。
取消 Future 里关联的 Callable 任务
mayInterruptIfRunning 入参:是否允许在线程运行时中断
返回 Callable 任务里 call()方法的返回值
调用该方法将导致程序阻塞,必须等到子线程结束以后才会得到返回值
返回 Callable 任务里 call()方法的返回值
该方法让程序最多阻塞 timeout 和 unit 指定的时间
如果经过指定时间后,Callable 任务依然没有返回值,将会抛出 TimeoutException 异常
如果 Callable 任务正常完成前被取消,则返回 true
如果 Callable 任务已经完成, 则返回 true
温馨提示:系统将通过浏览器临时记忆您曾经填写的个人信息且支持修改,评论提交后仅自己可见,内容需要经过审核后方可全面展示。