Android知识Java 杂谈

Java多线程基础补充

2017-11-28  本文已影响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();
    }
}

上一篇下一篇

猜你喜欢

热点阅读