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");
        }
    }
  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/joshua317/p/15325528.html
Copyright © 2011-2022 走看看