并发——Java 中创建线程的3种方法

2019-07-11  本文已影响0人  四喜汤圆

一、3种方法

1.继承 Thread 类

(1)创建 Thread 类的子类
重写run(),该方法就是线程的执行体

(2)创建 Thread 继承类的实例
即创建了线程对象

(3)调用线程对象的start()开启线程

public class Thread1 extends Thread {
    @Override
    public void run() {
        super.run();
        // 线程执行体
    }

    public static void main(String[] args) {
        Thread t = new Thread();
        t.start();
    }
}

2. 实现 Runnable 接口

(1)创建 Runnable 接口的实现类
重写run()作为线程执行体

(2)创建 Runnable 实现类的实例
将该实例作为 Thread 的 target 传入创建 Thread 对象,该 Thread 类的实例是线程对象

(3)调用线程对象的start()开启线程

public class Thread2 {

    private static class MyRunnable implements Runnable {
        @Override
        public void run() {
            // 线程执行体
        }
    }

    public static void main(String[] args) {
        MyRunnable r = new MyRunnable();
        Thread t = new Thread(r);
        t.start();
    }

}

3. Callable

(1)Callback 和 FutureTask 相结合

public class CallableTest {
    /**
     * Callable和FutureTask
     * FutureTask::get()的阻塞性
     */
    public static void main(String[] args) {
        MyCallable myCallable = new MyCallable();
        FutureTask < Integer > futureTask = new FutureTask(myCallable);
        Thread t = new Thread(futureTask);
        t.start();
        // 会阻塞线程
        try {
            System.out.println(futureTask.get());
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static class MyCallable implements Callable < Integer > {

        @Override
        public Integer call() throws Exception {
            return 0;
        }
    }
}

(2)Callable 和 Future 相结合
Java 并发编程

public class CallableTest {
    /**
     * Callable和Future
     * Future::get()的阻塞性
     * 在调用submit提交任务之后,主线程本来是继续运行了。但是运行到future.get()的时候就阻塞住了,一直等到任务执行完毕,拿到了返回的返回值,主线程才会继续运行。
     *
     * 这里注意一下,他的阻塞性是因为调用get()方法时,任务还没有执行完,所以会一直等到任务完成,形成了阻塞。
     *
     * 任务是在调用submit()方法时就开始执行了,如果在调用get()方法时,任务已经执行完毕,那么就不会造成阻塞。
     * @param args
     */
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        MyCallable callable = new MyCallable();
        Future < Integer > future = executorService.submit(callable);
        try {
            Integer res = future.get();
            System.out.println(res);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    private static class MyCallable implements Callable < Integer > {

        @Override
        public Integer call() throws Exception {
            return 0;
        }
    }
}

二、比较

RunnableCallable(实现接口的方式)

Thread

参考文献

lrh_Java线程

上一篇下一篇

猜你喜欢

热点阅读