zoukankan      html  css  js  c++  java
  • 进程和线程

    进程线程

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。 线程是比进程更小的执行单位,它是在一个进程中独立的控制流,一个进程可以启动多个线程,每条线程并行执行不同的任务。

    线程的生命周期

    初始(NEW):线程被构建,还没有调用 start()。

    运行(RUNNABLE):包括操作系统的就绪和运行两种状态。

    阻塞(BLOCKED):一般是被动的,在抢占资源中得不到资源,被动的挂起在内存,等待资源释放将其唤醒。线程被阻塞会释放CPU,不释放内存。

    等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。

    超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。

    终止(TERMINATED):表示该线程已经执行完毕。

    创建线程有哪几种方式?

    • 通过扩展Thread类来创建多线程
    • 通过实现Runnable接口来创建多线程,可实现线程间的资源共享
    • 实现Callable接口,通过FutureTask接口创建线程。
    • 使用Executor框架来创建线程池。

    继承 Thread 创建线程代码如下。run()方法是由jvm创建完操作系统级线程后回调的方法,不可以手动调用,手动调用相当于调用普通方法。

    /**
     * @author: joshua317
     * @time: 2021-09-09 08:11
     */
    public class MyThread extends Thread {
        public MyThread() {
        }
    
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread() + ":" + i);
            }
        }
    
        public static void main(String[] args) {
            MyThread mThread1 = new MyThread();
            MyThread mThread2 = new MyThread();
            MyThread myThread3 = new MyThread();
            mThread1.start();
            mThread2.start();
            myThread3.start();
        }
    }

    Runnable 创建线程代码:

    /**
     * @author: joshua317
     * @time: 2021-09-09 08:21
     */
    public class RunnableTest {
        public static  void main(String[] args){
            Runnable1 r = new Runnable1();
            Thread thread = new Thread(r);
            thread.start();
            System.out.println("主线程:["+Thread.currentThread().getName()+"]");
        }
    }
    
    class Runnable1 implements Runnable{
        @Override
        public void run() {
            System.out.println("当前线程:"+Thread.currentThread().getName());
        }
    }

    实现Runnable接口比继承Thread类所具有的优势:

    1. 资源共享,适合多个相同的程序代码的线程去处理同一个资源
    2. 可以避免java中的单继承的限制
    3. 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类

    Callable 创建线程代码:

    /**
     * @author: joshua317
     * @time: 2021-09-09 08:34
     */
    public class CallableTest {
        public static void main(String[] args) {
            Callable1 c = new Callable1();
    
            //异步计算的结果
            FutureTask<Integer> result = new FutureTask<>(c);
    
            new Thread(result).start();
    
            try {
                //等待任务完成,返回结果
                int sum = result.get();
                System.out.println(sum);
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    class Callable1 implements Callable<Integer> {
    
        @Override
        public Integer call() throws Exception {
            int sum = 0;
    
            for (int i = 0; i <= 100; i++) {
                sum += i;
            }
            return sum;
        }
    }

    使用 Executor 创建线程代码:

    /**
     * @author: joshua317
     * @time: 2021-09-09 08:50
     */
    public class ExecutorsTest {
        public static void main(String[] args) {
            //获取ExecutorService实例,生产禁用,需要手动创建线程池
            ExecutorService executorService = Executors.newCachedThreadPool();
            //提交任务
            executorService.submit(new RunnableDemo());
        }
    }
    
    class RunnableDemo implements Runnable {
        @Override
        public void run() {
            System.out.println("joshua317");
        }
    }
  • 相关阅读:
    使用discourse 作为社区工具
    dremio schema 更新的问题
    go-mysql-server 新版本发布
    开发一个dremio user_agent 解析函数
    java 几个不错的user_agent 解析工具包
    Docker Swarm 高可用详解
    用Docker Swarm实现容器服务高可用
    Docker 1.12 :认识 Swarm 模式下的节点崩溃处理
    Linux下磁盘分区调整(在不使用LVM的情况下)
    docker-swarm----多机容器管理
  • 原文地址:https://www.cnblogs.com/joshua317/p/15325528.html
Copyright © 2011-2022 走看看