Java并发编程之美读书笔记-并发编程基础1

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

  1. 线程

进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,比如idea运行代码时的jvm是一个进程,但是CPU资源比较特殊,它是被分配到线程的,线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源,真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。

  1. 线程的创建与运行

a.继承Thread类

public class ThreadTest {
    public static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("i am a child thread");
        }
    }

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

调用start方法后线程并没有马上执行而是处于就绪状态,这个就绪状态是指该线程已经获取了除CPU资源外的其他资源,等待获取CPU资源后才会真正处于运行状态

b.实现Runnable接口

public class ThreadTest {
    public static class RunnableTask implements Runnable {
        @Override
        public void run() {
            System.out.println("i am a child thread");
        }
    }

    public static void main(String[] args) {
        RunnableTask task = new RunnableTask();
        Thread threadA = new Thread(task);
        Thread threadB = new Thread(task);
        threadA.start();
        threadB.start();
    }
}

上述代码两个线程共用一个task代码逻辑。上述两种方式都有一个缺点,就是任务都没有返回值。

c.实现Callable接口

public class ThreadTest {
    public static class CallableTask implements Callable {

        @Override
        public String call() throws Exception {
            return "hello";
        }
    }

    public static void main(String[] args) {
        FutureTask task = new FutureTask<>(new CallableTask());
        new Thread(task).start();
        try {
            String result = task.get();
            System.out.println(result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

主线程main方法会阻塞在task.get()处,直到子线程执行完,拿到返回结果,主线程则会继续往下执行。

  1. 小结

使用继承方式的好处是方便传参,你可以在子类里面添加成员变量,通过set方法或者构造函数进行传递,而如果使用Runnable方式,则只能使用主线程里面被声明为final的变量。不好的地方是Java不支持多继承,如果继承了Thread类,那么子类不能再继承其他类,Runnable则没有这个限制,前两种方式都没办法拿到任务返回结果,但是FutureTask可以。

转载于:https://my.oschina.net/hensemlee/blog/3003495

你可能感兴趣的:(Java并发编程之美读书笔记-并发编程基础1)