在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

详解Java实现多线程的三种方式

2016-8-29 13:50| 发布者: zhangjf| 查看: 649| 评论: 0

摘要: 本文实例为大家分享了Java实现多线程的三种方式,供大家参考,具体内容如下 import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class Main { public static void main(String ...

本文实例为大家分享了Java实现多线程的三种方式,供大家参考,具体内容如下

  1. import java.util.concurrent.Callable;
  2. import java.util.concurrent.FutureTask;
  3. public class Main {
  4. public static void main(String[] args) {
  5. //方法一:继承Thread
  6. int i = 0;
  7. // for(; i < 100; i++){
  8. // System.out.println(Thread.currentThread().getName() + " " + i);
  9. // if (i == 5) {
  10. // ThreadExtendsThread threadExtendsThread = new ThreadExtendsThread();
  11. // threadExtendsThread.start();
  12. // }
  13. // }
  14. //方法二:实现Runnable
  15. // for(i = 0; i < 100; i++){
  16. // System.out.println(Thread.currentThread().getName() + " " + i);
  17. // if (i == 5) {
  18. // Runnable runnable = new ThreadImplementsRunnable();
  19. // new Thread(runnable).start();
  20. // new Thread(runnable).start();
  21. // }
  22. // }
  23. //方法三:实现Callable接口
  24. Callable<Integer> callable = new ThreadImplementsCallable();
  25. FutureTask<Integer> futureTask = new FutureTask<>(callable);
  26. for(i = 0; i < 100; i++){
  27. System.out.println(Thread.currentThread().getName() + " " + i);
  28. if (i == 5) {
  29. new Thread(futureTask).start();
  30. new Thread(futureTask).start();
  31. }
  32. }
  33. try {
  34. System.out.println("futureTask ruturn: " + futureTask.get());
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
复制代码

方法一,继承自Thread

  1. public class ThreadExtendsThread extends Thread {
  2. private int i;
  3. @Override
  4. public void run() {
  5. for(; i < 100; i++) {
  6. System.out.println(getName() + " " + i);
  7. }
  8. }
  9. }
复制代码

run方法为线程执行体,ThreadExtendsThread对象即为线程对象。

方法二,实现Runnable接口

  1. public class ThreadImplementsRunnable implements Runnable {
  2. private int i;
  3. @Override
  4. public void run() {
  5. for(; i < 100; i++){
  6. System.out.println(Thread.currentThread().getName() + " " + i);
  7. }
  8. }
  9. }
复制代码

run方法为线程执行体,使用时New一个Thread对象,Runnable对象作为target传递给Thread对象。且同一个Runnable对象可作为多个Thread的target,这些线程均共享Runnable对象的实例变量。

方法三,实现Callable接口

  1. import java.util.concurrent.Callable;
  2. public class ThreadImplementsCallable implements Callable<Integer> {
  3. private int i;
  4. @Override
  5. public Integer call() throws Exception {
  6. for(; i < 100; i++){
  7. System.out.println(Thread.currentThread().getName() + " " + i);
  8. }
  9. return i;
  10. }
  11. }
复制代码

Callable接口类似于Runnable接口,但比对方强大,线程执行体为call方法,该方法具有返回值和可抛出异常。使用时将Callable对象包装为FutureTask对象,通过泛型指定返回值类型。可稍候调用FutureTask的get方法取回执行结果。

以上就是本文的全部内容,希望对大家的学习有所帮助。

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-7 06:54

Copyright 2015-2025 djqfx

返回顶部