Java多线程的三种实现方式:继承继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返
回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。
1、继承Thread类:
实质上是实现Runnable接口的一个实例,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。例如:
public class ThreadUtil extends Thread{
//构造方法传参
public void run(){
//该处写要实现的方法 System.out.println("thread.run()"); } }
//启用多线程
ThreadUtil myTh = new ThreadUtil(); ThreadUtil myTh1 = new ThreadUtil(); myTh.start(); myTh1.start();
2、实现Runnable接口:
如果自己的类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口,如下:
public class ThreadUtil extends MD5 implements Runnable{
//构造方法传参
public ThreadUtil(){ } public void run(){
//要实现的方法
System.out.println("thread.run()"); } }
//启用多线程
ThreadUtil myTh = new ThreadUtil(); ThreadUtil myTh1 = new ThreadUtil(); Thread th = new Thread(myTh); Thread th1 = new Thread(myTh1); th.start(); th1.start();
3、使用ExecutorService、Callable、Future实现有返回结果的多线程:
ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类,返回结果的线程是在JDK1.5中引入的新特征。可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。部分代码如下:
编写Callable类实现Callable接口:
...
import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch;
public class CallableUtil implements Callable<Map<String,List<Map<String, Object>>>> {
//Map<String,List<Map<String, Object>>>返回值类型
//参数
private String flag; private Map<String,String> map; private CountDownLatch latch; //构造方法 public CallableUtil(Map<String, String> map,String flag, CountDownLatch latch) { this.flag = flag; this.map = map; this.latch = latch; }
public Map<String,List<Map<String, Object>>> call() throws Exception {
//该处写要实现的方法,根据条件不同,该线程要实现的方法也不同,以达到提高效率的目的
latch.countDown();// 完成工作,计数器减一
....
}}
调用上述类实现多线程:
...
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future;
//在要用到多线程处
//创建线程池
ExecutorService producerPool = Executors.newFixedThreadPool(4);//4代表线程数量
CountDownLatch latch = new CountDownLatch(4);// 协同
//获取Future对象
Future<?> f1 = null; Future<?> f2 = null; Future<?> f3 = null; Future<?> f4 = null; f1 = producerPool.submit(new CallableUtil(paramMap,"1", latch)); f2 = producerPool.submit(new CallableUtil(paramMap,"2", latch)); f3 = producerPool.submit(new CallableUtil(paramMap,"3", latch)); f4 = producerPool.submit(new CallableUtil(paramMap,"4", latch)); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); Thread.currentThread().interrupt(); } finally { }
//从Future对象上获取任务的返回值
Map<String,List<Map<String, Object>>> map1 = (Map<String, List<Map<String, Object>>>) f1.get(); Map<String,List<Map<String, Object>>> map2 = (Map<String, List<Map<String, Object>>>) f2.get(); Map<String,List<Map<String, Object>>> map3 = (Map<String, List<Map<String, Object>>>) f3.get(); Map<String,List<Map<String, Object>>> map4 = (Map<String, List<Map<String, Object>>>) f4.get(); // 等待工作完成(关闭线程池) producerPool.shutdown();
.......
以上就是Java实现多线程的三种方式。
