Java多线程基础补充

作者: 有苦向瓜诉说 | 来源:发表于2017-11-28 16:30 被阅读11次

使用Callable接口和FutureTask来创建线程

  1. 创建Callable的实现类,实现call方法,可以直接使用lambda或者匿名类来创建。
  2. 用FutureTask包装Callable对象,该FutureTask对象封装了call方法的返回值。
  3. 使用FutureTask对象作为Thread的target创建并启动线程。
  4. 使用FutureTask的get方法来获得子线程的返回值。
  5. 注意:FutureTask只能执行一次,所以用两个相同task来创建线程只有一个获得执行(随机)。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class SaleWindow {

    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
        FutureTask<Integer> task = new FutureTask<>(() -> {
            int i = 0;
            for (; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + i);
            }
            return i;
        });
        FutureTask<Integer> task2 = new FutureTask<>((Callable<Integer>) () -> {
            int i = 0;
            for (; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + i);
            }
            return i;
        });
        new Thread(task, "return").start();
        new Thread(task2, "other").start();
        new Thread(task2, "another").start();

        try {
            System.out.println(task2.get());
            System.out.println(task.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

使用Runnable创建线程

  1. 使用Runnable创建线程作为target传入Thread,实质上就是Thread负责执行Runnable的run方法。
  2. 使用Runnable创建的同一个Runnable可以共享实例变量,注意是成员变量,而不是局部变量。
  3. 使用Runnable创建的线程要获得当前线程必须使用Thread.currentThread()来获取,而通过继承Thread创建的线程可以直接使用this来获取。
  4. 使用Runnable可以更加灵活,可以implements多个接口,而使用Thread就只能继承这一个父类。
public class SaleWindow implements Runnable {
    private int i;
    public void run(){
        for(;i<10;i++){
            System.out.println(Thread.currentThread().getName()+":"+i);
        }
    }
    public static void main(String[] args){
        System.out.println(Thread.currentThread().getName());
        Runnable task = new SaleWindow();
        new Thread(task).start();
        new Thread(task).start();
        new Thread(task).start();
    }
}

相关文章

  • Java多线程基础补充

    使用Callable接口和FutureTask来创建线程 创建Callable的实现类,实现call方法,可以直接...

  • 【JAVA基础-多线程】- 多线程(补充)

    线程控制的常见方法 sleep 休眠线程public static native void sleep(long ...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

  • Java多线程系列目录(共43篇)-转

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 Java多线程系列--“基础篇”0...

  • Android中的多线程

    1. Java多线程基础 Java多线程,线程同步,线程通讯 2. Android常用线程 HandlerThre...

网友评论

    本文标题:Java多线程基础补充

    本文链接:https://www.haomeiwen.com/subject/ttrebxtx.html