[关闭]
@nalan90 2017-09-08T09:18:35.000000Z 字数 5165 阅读 672

多线程开发

Java


线程的生存周期

image_1b15ncgtq7pj101915l11ojf5cg9.png-475.1kB


线程的实现


线程相关类常用方法


示例代码

  1. ## extends Thread class
  2. class MyThread extends Thread {
  3. private String name;
  4. public MyThread(String name) {
  5. this.name = name;
  6. }
  7. public void run() {
  8. System.out.println("Thread name:" + this.name + " Thread ID:" + Thread.currentThread().getId());
  9. }
  10. }
  11. public class Demo02 {
  12. public static void main(String args[]) {
  13. System.out.println("Main thread ID:" + Thread.currentThread().getId());
  14. MyThread t1 = new MyThread("thread1");
  15. t1.start();
  16. MyThread t2 = new MyThread("thread2");
  17. t2.start();
  18. }
  19. }
  20. ## 运行结果
  21. Main thread ID:1
  22. Thread name:thread1 Thread ID:10
  23. Thread name:thread2 Thread ID:11
  24. ----------
  25. ## implements Runnable interface
  26. class MyRunnable implements Runnable {
  27. public void run() {
  28. System.out.println("Thread ID:" + Thread.currentThread().getId());
  29. }
  30. }
  31. public class Demo03 {
  32. public static void main(String args[]) {
  33. System.out.println("Main thread ID:" + Thread.currentThread().getId());
  34. MyRunnable run = new MyRunnable();
  35. Thread t = new Thread(run);
  36. t.start();
  37. }
  38. }
  39. ## 运行结果
  40. Main thread ID:1
  41. Thread ID:10

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

ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了,再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。
常用方法如下:

示例代码

  1. package com.jiudouyu.thread;
  2. import java.util.concurrent.*;
  3. import java.util.*;
  4. class MyCallable implements Callable<Object> {
  5. private String taskNum;
  6. MyCallable(String taskNum) {
  7. this.taskNum = taskNum;
  8. }
  9. public Object call() throws Exception {
  10. System.out.println(">>>" + taskNum + "任务启动");
  11. Date dateTmp1 = new Date();
  12. Thread.sleep(1000);
  13. Date dateTmp2 = new Date();
  14. long time = dateTmp2.getTime() - dateTmp1.getTime();
  15. System.out.println(">>>" + taskNum + "任务终止");
  16. return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";
  17. }
  18. }
  19. public class Demo04 {
  20. public static void main(String[] args) throws ExecutionException, InterruptedException {
  21. System.out.println("----程序开始运行----");
  22. Date date1 = new Date();
  23. int taskSize = 5;
  24. // 创建一个线程池
  25. ExecutorService pool = Executors.newFixedThreadPool(taskSize);
  26. // 创建多个有返回值的任务
  27. List<Future> list = new ArrayList<Future>();
  28. for (int i = 0; i < taskSize; i++) {
  29. Callable c = new MyCallable(i + " ");
  30. // 执行任务并获取Future对象
  31. Future f = pool.submit(c);
  32. // System.out.println(">>>" + f.get().toString());
  33. list.add(f);
  34. }
  35. // 关闭线程池
  36. pool.shutdown();
  37. // 获取所有并发任务的运行结果
  38. for (Future f : list) {
  39. // 从Future对象上获取任务的返回值,并输出到控制台
  40. System.out.println(">>>" + f.get().toString());
  41. }
  42. Date date2 = new Date();
  43. System.out.println("----程序结束运行----,程序运行时间【"
  44. + (date2.getTime() - date1.getTime()) + "毫秒】");
  45. }
  46. }
  47. ## 运行结果
  48. ----程序开始运行----
  49. >>>0 任务启动
  50. >>>1 任务启动
  51. >>>2 任务启动
  52. >>>3 任务启动
  53. >>>4 任务启动
  54. >>>0 任务终止
  55. >>>0 任务返回运行结果,当前任务时间【1000毫秒】
  56. >>>2 任务终止
  57. >>>3 任务终止
  58. >>>1 任务终止
  59. >>>1 任务返回运行结果,当前任务时间【1001毫秒】
  60. >>>2 任务返回运行结果,当前任务时间【1001毫秒】
  61. >>>3 任务返回运行结果,当前任务时间【1000毫秒】
  62. >>>4 任务终止
  63. >>>4 任务返回运行结果,当前任务时间【1002毫秒】
  64. ----程序结束运行----,程序运行时间【1010毫秒】
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注