Java实现多线程的三种方式

来源:互联网 发布:郑州学软件 编辑:程序博客网 时间:2024/05/16 17:59

以前自己用过的是前两种,后来又从别的博客上了解到可以实现有返回值的多线程


1. 继承Thread类,重写Run()方法


public class MyThread extends Thread {  public void run() {   System.out.println("MyThread.run()");  }}

调用Start()方法 启动线程

MyThread myThread1 = new MyThread();MyThread myThread2 = new MyThread();myThread1.start();myThread2.start();

但这种方法 有局限性 :一是Java是单继承的,如果继承了Thread类,就无法继承其他类了; 二是多个线程同时返回一个相同的代码块,可能出现安全问题

一般推荐使用下面这种


2.实现Runnable接口,重写Run()方法


public class MyThread  implements Runnable {  public void run() {   System.out.println("MyThread.run()");  }}

启动线程 需要先实例化一个Thread 并传入一个实现了Runnable接口的实例

MyThread myThread = new MyThread();Thread thread = new Thread(myThread);thread.start();

3.使用ExecutorService、Callable、Future实现有返回结果的多线程

ExecutoreService提供了submit()方法,传递一个Callable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

import java.util.concurrent.*;import java.util.Date;import java.util.List;import java.util.ArrayList;/*** Java线程:有返回值的线程* * @author wb_qiuquan.ying*/@SuppressWarnings("unchecked")public class Test {public static void main(String[] args) throws ExecutionException,    InterruptedException {   System.out.println("----程序开始运行----");   Date date1 = new Date();   int taskSize = 5;   // 创建一个线程池   ExecutorService pool = Executors.newFixedThreadPool(taskSize);   // 创建多个有返回值的任务   List<Future> list = new ArrayList<Future>();   for (int i = 0; i < taskSize; i++) {    Callable c = new MyCallable(i + " ");    // 执行任务并获取Future对象    Future f = pool.submit(c);    // System.out.println(">>>" + f.get().toString());    list.add(f);   }   // 关闭线程池   pool.shutdown();   // 获取所有并发任务的运行结果   for (Future f : list) {    // 从Future对象上获取任务的返回值,并输出到控制台    System.out.println(">>>" + f.get().toString());   }   Date date2 = new Date();   System.out.println("----程序结束运行----,程序运行时间【"     + (date2.getTime() - date1.getTime()) + "毫秒】");}}class MyCallable implements Callable<Object> {private String taskNum;MyCallable(String taskNum) {   this.taskNum = taskNum;}public Object call() throws Exception {   System.out.println(">>>" + taskNum + "任务启动");   Date dateTmp1 = new Date();   Thread.sleep(1000);   Date dateTmp2 = new Date();   long time = dateTmp2.getTime() - dateTmp1.getTime();   System.out.println(">>>" + taskNum + "任务终止");   return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";}}

参考

http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子做事不细心怎么办 孩子学习不够细心怎么办 孩子不用心学习怎么办? 恋爱中不够细心怎么办 孩子不愿学英语怎么办 孩子不愿学数学怎么办 孩子不愿学钢琴怎么办 小孩子学习不开窍怎么办 一年级没有读好怎么办 小孩眉毛很杂乱怎么办 孩子不好好听课怎么办 成绩差的孩子怎么办 三年级语文太差怎么办? 孩子叛逆不学习怎么办 三年级阅读理解能力差怎么办 孩子静不下心怎么办 孩子体温低于35怎么办 小孩体温突然低怎么办 宝宝35.5度体温怎么办 宝宝出汗体温低怎么办 小孩体温35.2度怎么办 孩子睡觉出冷汗怎么办 小孩感冒发烧咳嗽怎么办 小孩咳嗽出汗多怎么办 小孩手脚出汗多怎么办 小孩感冒出虚汗怎么办 宝宝感冒出冷汗怎么办 宝宝感冒睡觉出汗怎么办 宝宝感冒冒冷汗怎么办 宝宝感冒爱出汗怎么办 宝宝感冒老出汗怎么办 两只小鸡打架怎么办 老年人老是换保姆怎么办 孩子9不吃饭怎么办 两岁半宝宝不爱喝水怎么办 宝宝老是不吃饭怎么办 宝宝不爱吃饭喝水怎么办 小宝宝突然不爱吃饭怎么办 一岁多小宝宝不爱吃饭怎么办 宝宝肚子发撑怎么办 小宝宝咳嗽有痰怎么办