java并发编程-进程与线程

进程与线程的概念

程序是由指令和数据组成的, 但是指令需要运行, 数据要读写, 就必须将指令加载至cpu, 数据加载至内存。

java中线程是最小的调度单位, 进程是资源分配的最小单位。

进程: 当一个程序被运行, 从磁盘加载这个程序的代码至内存, 这时就开启了一个进程。

线程: 一个进程可以分为多个线程, 一个线程就是一个指令流,指令流中的指令交给CPU执行。

进程通信: 同一台计算机的进程通信称为IPC, 不同计算机通信需要通过网络, 遵守共同的协议, 例如http协议。

线程通信: 在进程内,共享进程的内存, 多线程可以共享变量。

并行和并发的区别

并发: 是指一个处理器同时处理多个任务。 

并行: 是指多个处理器同时处理多个不同的任务。 

线程的基本应用

1.异步调用:不需要方法的返回就能继续运行。

2.同步调用:需要方法的返回才能继续运行。

3.多线程应用之提高效率

案例一:

充分利用多核cpu核数优势, 并行计算, 相互计算之间没有依赖关系, 最后汇总结果。

4.创建和运行线程

第一种创建线程的方法:

public class CreateThread {
    private static final Logger LOG = LoggerFactory.getLogger(CreateThread.class);

    public static void main(String[] args) {

        Thread thread1 = new Thread("thread1"){
            @Override
            public void run() {
                LOG.info("info2");
            }
        };

        thread1.start();
        LOG.info("info1");
    }
}

第二种创建线程的方法(推荐使用):

public class CreateThread2 {
    private static final Logger LOG = LoggerFactory.getLogger(CreateThread2.class);
    public static void main(String[] args) {

        Runnable runnable =new Runnable() {
            @Override
            public void run() {
                //执行的任务
                LOG.info("running");

            }
        };

        //创建线程
        Thread t = new Thread(runnable,"t2");
        t.start();

    }
}

jdk1.8之后使用lambda表达式创建线程精简代码:

如果接口带有@FunctionalInterface注解和只有一个抽象方法就可以使用lambda表达式, Runnable源码:

@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

lambda表达式(Alt+Enter快捷键转成lambda):

public class CreateThread2 {
    private static final Logger LOG = LoggerFactory.getLogger(CreateThread2.class);
    public static void main(String[] args) {

        Runnable runnable = () -> {
            //执行的任务
            LOG.info("running");

        };

        //创建线程
        Thread t = new Thread(runnable,"t2");
        t.start();
    }
}

创建多线程第三种创建线程的方法, FutrueTask配合Thread: 

public class CreateThread {
    private static final Logger LOG = LoggerFactory.getLogger(CreateThread.class);

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<Integer> futureTask =new FutureTask<Integer>(new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                LOG.info("running");
                Thread.sleep(2000);
                return 100;
            }
        });

        Thread t1 =new Thread(futureTask,"t1");
        t1.start();

        LOG.info("{}", futureTask.get());
    }
}

5.

 

posted @ 2020-12-23 11:56  所向披靡zz  阅读(105)  评论(0编辑  收藏  举报