Java的并发一般有三种实现方式,其分别可以以其关键技术分为Thread, Runnable, Concurrent这三种方式:
Thread
例子:
class Example1 extends Thread { @Override public void run() { System.out.println(“This is a thread !”); } public static void main(String[] args) throws InterruptedException, IOException { Example1 Exa = new Example1(); Exa.start(); Thread.sleep(1000); } }
特点:
1.重载Thread中的run方法,完成你需要做的工作
2.不能控制产生的线程,使其自身自灭
3.Run中没有返回的结果,也不能传参数
2.不能控制产生的线程,使其自身自灭
3.Run中没有返回的结果,也不能传参数
Runnable
例子:
class Example2 implements Runnable { @Override public void run() { System.out.println("This is a thead ! "); } public static void main(String[] args) throws InterruptedException, IOException { Thread thread = new Thread(new Example2()); thread.start(); Thread.sleep(1000); } }
特点:
1.实现Runnable 中的run方法,完成你需要做的工作
2.不能控制产生的线程,使其自身自灭
3.Run中没有返回的结果,也不能传参数
3.Run中没有返回的结果,也不能传参数
Concurrent
例子:
class TaskWithResult implements Callable<String> { private int id; public TaskWithResult(int id) { this.id = id; } @Override public String call() throws Exception { return "result of TaskWithResult " + id; } } public class CallableTest { public static void main(String[] args) throws InterruptedException,ExecutionException { ExecutorService exec = Executors.newCachedThreadPool(); ArrayList<Future<String>> results = new ArrayList<Future<String>>(); for (int i = 0; i < 10; i++) { results.add(exec.submit(new TaskWithResult(i))); } for (Future<String> fs : results) { if (fs.isDone()) { System.out.println(fs.get()); } else { System.out.println("Future result is not yet complete"); } } exec.shutdown(); } }
特点:
1.线程与任务有明显的界限
2.拥有线程管理、状态查询等等功能
3.有查询任务返回结果、查询任务执行状态,中断任务执行等等管理功能
***********************************************************************************************************************
***********************************************************************************************************************
***********************************************************************************************************************
我们可以看看一些代码,可以发现Thread, Runnable实现的多线程是缺乏功能的纯多线程:
//Thread.Java
class Thread implements Runnable { … public void run() { if (target != null) { target.run(); } } …. }
//Runnable.Java
Public interface Runnable
{
public abstract void run();
}
可以清楚的看到其实上诉两种方法的本质都是一样的,其和Concurrent相比有如下差别:
1.任务与线程概念耦合,线程与任务之间界限模糊
2.线程管理由任务提交者全权负责,职责模糊
3.线程无法重复利用,造成线程的重复创建与销毁--由于Thread执行完毕,不能再次执行其他任务
4.对于需要线程管理、状态查询等等功能,没有很好的支持
5.当需要查询任务返回结果、查询任务执行状态,中断任务执行等等管理功能时,都需要自行设计复杂的任务实现
2.线程管理由任务提交者全权负责,职责模糊
3.线程无法重复利用,造成线程的重复创建与销毁--由于Thread执行完毕,不能再次执行其他任务
4.对于需要线程管理、状态查询等等功能,没有很好的支持
5.当需要查询任务返回结果、查询任务执行状态,中断任务执行等等管理功能时,都需要自行设计复杂的任务实现