2020年4月

进程(process)和线程(thread)

实现并发最直接的方式是在操作系统级别使用进程。进程是运行在它自己的地址空间内的自包容的程序。
一个线程就是在进程中的一个单一的顺序控制流,单个进程可以拥有多个并发执行任务。

Runnable和Thread

通过Runnable定义任务

线程可以驱动任务,Java中是由Runnable接口提供,需要实现Runnable接口的run()方法。任务run()方法通常总会有某种形式的循环,使得任务一直运行下去直到不再需要。通常run()被写成无限循环的形式。
例如:

public class LiftOff implements Runnable {
    protected int countDown = 10;    //倒计数
    private static int taskCount;
    private final int id = taskCount ++;
    
    public LiftOff() {
        super();
    }
    public LiftOff(int countDown) {
        super();
        this.countDown = countDown;
    }
    
    public String status() {
        return String.format("#%d(%s).", id, (countDown > 0) ? countDown : "LiftOff!");
    }

    @Override
    public void run() {
        while(countDown-- > 0) {
            System.out.print(status());
            Thread.yield();
        }
    }
}

静态方法Thread.yield()

Thread.yield()线程调度器的一种建议,暗示:我已经执行完生命周期中最重要的部分了,现在正是将CPU资源切换给其他任务执行一段时间的时机。

Thread类

Runnable对象转变为工作任务的传统方式是将它提交给一个Thread的构造器。
使用方法如下:

public class BasicThreads {
    public static void main(String[] args) {
        Thread t = new Thread(new LiftOff());
        t.start();
        System.out.println("Waiting for LiftOff");
    }
}

Executor和线程池

Executor是Java SE5引入的,用来管理Thread对象,从而简化并发编程。Executor是启动任务的优选方法

ExecutorService

ExecutorService是具有生命周期的Executor,会管理如何构建恰当的上下文来执行Runnable对象。非常常见的情况是:单个Executor用来创建和管理系统中所有的任务。
在任何线程池中,在现有的线程的可能情况下,都会被自动复用

CachedThreadPool

CachedThreadPool为每个任务都创建一个线程,使用方法:

public class CachedThreadPool {
    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        for(int i = 0; i < 5; i ++) {
            exec.execute(new LiftOff());
        }
        exec.shutdown();
    }
}

- 阅读剩余部分 -

Docker介绍

Docker是一个应用程序,它简化了在容器中管理应用程序进程的过程。容器允许您在资源隔离的进程中运行应用程序。它们与虚拟机类似,但是容器更可移植、更友好、更依赖于主机操作系统。

Docker安装的要求

系统要求

安装Docker支持如下系统:

  • Debian/Ubuntu Buster 10(stable)
  • Debian/Ubuntu Stretch 9 / Raspbian Stretch

卸载旧的版本(可选)

如果已安装有旧的版本,需要先卸载。卸载命令为:

sudo apt-get remove docker docker-engine docker.io containerd runc

Docker安装

Debian官方中的安装包中的Docker版本不一定是最新的,为了确保我们从Docker官方安装最新的Docker,我们需要添加一个新的包源,从Docker添加GPG密钥以确保下载是有效的,然后安装包。
注:如果是通过root登录的,下面的命令都可以省掉sudo

1. 更新Debian源和安装依赖

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

2. 添加GPG Key

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

3. 将Docker库添加至APT源,注意系统的平台,根据不同平台执行不同的命令

## x86_64 / amd64 平台
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

# armhf 平台
sudo add-apt-repository "deb [arch=armhf] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

# arm64 平台
sudo add-apt-repository "deb [arch=arm64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"

- 阅读剩余部分 -