转战JavaEE ,总体上是非常习惯和喜欢Java这门语言,先不说Java为何而生,适应什么场景,解决什么问题,单论Java那几十年沉淀积累,也给人一种厚重、正统感!扯远啦,Java也只是一门语言,一个给人们解决问题的工具,工具不论好坏,关键看怎们用!
下面自己总结下JavaEE中的多线程。
三种使用方法
implements Rannable
class MyThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("当前线程:"+Thread.currentThread().getName());
}
}
}
public class ThreadTest {
public static void main(String[] args) {
new Thread(new MyThread(), "子线程1").start();
}
}
extends Thread
class MyThread extends Thread{
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("当前线程:"+Thread.currentThread().getName());
}
}
}
public class ThreadTest {
public static void main(String[] args) {
new MyThread().start();
}
}
implements Callable
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyThread implements Callable<String>{
@Override
public String call() throws Exception {
//执行任务
return "任务执行完毕";
}
}
public class ThreadTest {
public static void main(String[] args) throws Exception{
MyThread task = new MyThread();
FutureTask<String> futureTask = new FutureTask<>(task); //FutureTask 也继承了Runnable接口
new Thread(futureTask).start();
System.out.println("主线程:"+ futureTask.get());
}
}
小结
1、继承Thread和Rannable有何区别?
这两种方式都可以实现多线程开发,但在实践中,首推Rannable。
原因有二,其一,使用Rannable可以避免单继承的局限问题;其二,使用Runable可以更好的体现数据共享的概念。
2、Callable有什么特点?
在方案一,方案二当中我们发现他们有个共同缺陷,就是都不能反回操作结果,为了弥补这一缺陷,从jdk1.5开始,Java便添加了此接口,来弥补前面两种方案无法反回操作结果的缺陷。