seizemiss

一、创建多线程的方法

1.继承Thread类
      类 Thread的类头为:public class Thread implement runnable
      继承Thread类,并重写Thread中的run方法
      例如:
 1 package com.dragon.test;
 2 
 3 public class MyThread extends Thread{
 4   @Override
 5   public void run(){
 6      System.out.println("创建多线程方法一");
 7   }
 8   public static void main(String[] args) {
 9      MyThread thread=new MyThread();
10      thread.start();
11      System.out.println("运行结束");
12   }
13 
14 }

运行结果: 

这说明在使用多线程技术时,代码的运行结果与代码执行顺序后调用代码的顺序是无关的
      即线程是一个子任务,CPU以随机的时间来调用线程中的方法。
      注意:1.不能多次调用Thread中的start()方法,否则会抛出IllegalThreadStateException异常。
           2.启动线程的方法不是run()方法而是start方法,如果调用的是run()方法就是同步的,并不能异步执行。
           3.执行start()方法的顺序不代表线程启动的顺序,即并不是说,越早调用某个线程的start()方法,它就能
             越早的执行其中的run()方法。
 2.实现Runnable接口
      实现Runnable接口,重写run()方法
      例如:
  
 1  package com.dragon.test;
 2 
 3  public class MyThread implements Runnable{
 4      @Override
 5      public void run(){
 6          System.out.println("创建多线程方法二");
 7      }
 8      public static void main(String[] args) {
 9            MyThread thread=new MyThread();
10            Thread t=new Thread(thread);
11            t.start();
12            System.out.println("运行结束");
13      }
14 
15  }    
运行结果与上述第一种的运行结果没有什么特殊之处


因为Thread类也实现了Runnable接口,所以Thread中的构造函数就可以传入一个Runnable接口的对象,也可以传入一个Thread类的对象

 

3.实现Callable接口
      实现Callable接口,重写call()方法
      例如:
package com.dragon.test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class MyThread implements Callable<string>{
public static void main(String[] args) {
ExecutorService threadPool=Executors.newSingleThreadExecutor();
//启动多线程
Future<string> future=threadPool.submit(new MyThread());
try{
 System.out.println("waiting thread to finish");
 System.out.println(future.get());
}catch(Exception e){
 e.printStackTrace();
}

}

@Override
public String call() throws Exception {
 // TODO Auto-generated method stub
 return "创建多线程方法三";
 }

 }</string></string>

  运行结果:

Callable接口是属于Executor,对比与Runnable接口功能的区别是:
      (1).Callable可以在任务结束后提供一个返回值,Runnable没有这个功能
      (2).Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常
      (3).运行Callable可以拿到一个Future对象,Future独享表示异步计算的结果,它提供了
          检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数
          的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况,
          放调用Future的get()方法以获取结果时,当前线程就会阻塞,知道call()方法结束返回结果。

二、推荐实现多线程的方法--实现Runnable接口

    原因:
    (1).Thread类中定义了多种方法可以被派生类使用或重写,但是只有run()方法必须被重写的,在run()方法中实现啊这个线程的主要功能,这就是Runnable接口所需实现的方法
    (2).通过继承Thread的实现方法与实现Runnable接口的效果相同,并且Java只能是单继承、多实现,如果一个类中已经继承其他所需的类,那实现一个接口是必须的。

 

分类:

技术点:

相关文章: