java 线程三种实现方式

Original 2016-11-04 14:08:54 438
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>


Release Notes

Popular Entries