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多线程基础补充

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