abstract:1继承thread<code class="hljs java"><span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyw
1继承thread
<code class="hljs java"><span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">class<span class="hljs-class"> <span class="hljs-title"><span class="hljs-class"><span class="hljs-title">MultiThread1<span class="hljs-class"> <span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">extends<span class="hljs-class"> <span class="hljs-title"><span class="hljs-class"><span class="hljs-title">Thread{ <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">run<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(){ <span class="hljs-keyword">for(<span class="hljs-keyword">int i=<span class="hljs-number">0; i<<span class="hljs-number">7; i++){ System.out.println(<span class="hljs-string">"name:"+<span class="hljs-keyword">this.getName()+<span class="hljs-string">" i:"+ i+<span class="hljs-string">" "); } } <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">main<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(String[] args)<span class="hljs-function"> { MultiThread1 tA = <span class="hljs-keyword">new MultiThread1(); tA.setName(<span class="hljs-string">"AA"); MultiThread1 tB = <span class="hljs-keyword">new MultiThread1(); tB.setName(<span class="hljs-string">"BB"); tA.start(); tB.start(); } }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
2实现Runnable
<code class="hljs java"><span class="hljs-keyword">public <span class="hljs-class"><span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">class<span class="hljs-class"> <span class="hljs-title"><span class="hljs-class"><span class="hljs-title">MyRunnable<span class="hljs-class"> <span class="hljs-keyword"><span class="hljs-class"><span class="hljs-keyword">implements<span class="hljs-class"> <span class="hljs-title"><span class="hljs-class"><span class="hljs-title">Runnable{ <span class="hljs-keyword">private String name; <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> String <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">getName<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()<span class="hljs-function"> { <span class="hljs-keyword">return name; } <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">setName<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(String name)<span class="hljs-function"> { <span class="hljs-keyword">this.name = name; } <span class="hljs-meta">@Override <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">run<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">()<span class="hljs-function"> { <span class="hljs-comment">// TODO Auto-generated method stub <span class="hljs-keyword">for(<span class="hljs-keyword">int i=<span class="hljs-number">0; i<<span class="hljs-number">10; i++){ System.out.println(<span class="hljs-string">"name:"+<span class="hljs-keyword">this.getName()+<span class="hljs-string">" i:"+ i+<span class="hljs-string">" "); } } <span class="hljs-function"><span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">public<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">static<span class="hljs-function"> <span class="hljs-keyword"><span class="hljs-function"><span class="hljs-keyword">void<span class="hljs-function"> <span class="hljs-title"><span class="hljs-function"><span class="hljs-title">main<span class="hljs-params"><span class="hljs-function"><span class="hljs-params">(String[] args)<span class="hljs-function"> { MyRunnable mA = <span class="hljs-keyword">new MyRunnable(); mA.setName(<span class="hljs-string">"AA"); MyRunnable mB = <span class="hljs-keyword">new MyRunnable(); mB.setName(<span class="hljs-string">"BB"); Thread t1 = <span class="hljs-keyword">new Thread(mA); Thread t2 = <span class="hljs-keyword">new Thread(mB); t1.start(); t2.start(); } }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>
3 使用ExecutorService、Callable、Future实现有返回结果的多线程
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。想要详细了解Executor框架的可以访问http://www.javaeye.com/topic/366591 ,这里面对该框架做了很详细的解释。返回结果的线程是在JDK1.5中引入的新特征,确实很实用,有了这种特征我就不需要再为了得到返回值而大费周折了,而且即便实现了也可能漏洞百出。
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。下面提供了一个完整的有返回结果的多线程测试例子,在JDK1.5下验证过没问题可以直接使用。
<code class="hljs typescript"><span class="hljs-keyword">import java.util.concurrent.*; <span class="hljs-keyword">import java.util.Date; <span class="hljs-keyword">import java.util.List; <span class="hljs-keyword">import java.util.ArrayList; <span class="hljs-comment">/** * 有返回值的线程 */ @SuppressWarnings(<span class="hljs-string">"unchecked") <span class="hljs-keyword">public <span class="hljs-keyword">class Test { <span class="hljs-keyword">public <span class="hljs-keyword">static <span class="hljs-built_in">void main(<span class="hljs-built_in">String[] args) throws ExecutionException, InterruptedException { System.out.println(<span class="hljs-string">"----程序开始运行----"); <span class="hljs-built_in">Date date1 = <span class="hljs-keyword">new <span class="hljs-built_in">Date(); int taskSize = <span class="hljs-number">5; <span class="hljs-comment">// 创建一个线程池 ExecutorService pool = Executors.newFixedThreadPool(taskSize); <span class="hljs-comment">// 创建多个有返回值的任务 List<Future> list = <span class="hljs-keyword">new ArrayList<Future>(); <span class="hljs-keyword">for (int i = <span class="hljs-number">0; i < taskSize; i++) { Callable c = <span class="hljs-keyword">new MyCallable(i + <span class="hljs-string">" "); <span class="hljs-comment">// 执行任务并获取Future对象 Future f = pool.submit(c); <span class="hljs-comment">// System.out.println(">>>" + f.get().toString()); list.add(f); } <span class="hljs-comment">// 关闭线程池 pool.shutdown(); <span class="hljs-comment">// 获取所有并发任务的运行结果 <span class="hljs-keyword">for (Future f : list) { <span class="hljs-comment">// 从Future对象上获取任务的返回值,并输出到控制台 System.out.println(<span class="hljs-string">">>>" + f.get().toString()); } <span class="hljs-built_in">Date date2 = <span class="hljs-keyword">new <span class="hljs-built_in">Date(); System.out.println(<span class="hljs-string">"----程序结束运行----,程序运行时间【" + (date2.getTime() - date1.getTime()) + <span class="hljs-string">"毫秒】"); } } <span class="hljs-keyword">class MyCallable <span class="hljs-keyword">implements Callable<<span class="hljs-built_in">Object> { <span class="hljs-keyword">private <span class="hljs-built_in">String taskNum; MyCallable(<span class="hljs-built_in">String taskNum) { <span class="hljs-keyword">this.taskNum = taskNum; } <span class="hljs-keyword">public <span class="hljs-built_in">Object call() throws Exception { System.out.println(<span class="hljs-string">">>>" + taskNum + <span class="hljs-string">"任务启动"); <span class="hljs-built_in">Date dateTmp1 = <span class="hljs-keyword">new <span class="hljs-built_in">Date(); Thread.sleep(<span class="hljs-number">1000); <span class="hljs-built_in">Date dateTmp2 = <span class="hljs-keyword">new <span class="hljs-built_in">Date(); long time = dateTmp2.getTime() - dateTmp1.getTime(); System.out.println(<span class="hljs-string">">>>" + taskNum + <span class="hljs-string">"任务终止"); <span class="hljs-keyword">return taskNum + <span class="hljs-string">"任务返回运行结果,当前任务时间【" + time + <span class="hljs-string">"毫秒】"; } }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code>