zoukankan      html  css  js  c++  java
  • 多线程

    进程

    进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
    2. 线程

    线程是一条执行路径,是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。

    一个正在运行的软件(如迅雷)就是一个进程,一个进程可以同时运行多个任务( 迅雷软件可以同时下载多个文件,每个下载任务就是一个线程), 可以简单的认为进程是线程的集合。

    线程是一条可以执行的路径。多线程就是同时有多条执行路径在同时(并行)执行。
    3. 进程与线程的关系

    一个程序就是一个进程,而一个程序中的多个任务则被称为线程。进程是表示资源分配的基本单位,又是调度运行的基本单位。,亦即执行处理机调度的基本单位。 进程和线程的关系:

        一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

        资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量,即每个线程都有自己的堆栈和局部变量。

        处理机分给线程,即真正在处理机上运行的是线程。

        线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
    顺序编程:程序从上往下的同步执行,即如果第一行代码执行没有结束,第二行代码就只能等待第一行执行结束后才能结束。

    public class Main {
        // 顺序编程 吃喝示例:当吃饭吃不完的时候,是不能喝酒的,只能吃完晚才能喝酒
        public static void main(String[] args) throws Exception {
            // 先吃饭再喝酒
            eat();
            drink();
        }

        private static void eat() throws Exception {
            System.out.println("开始吃饭?... " + new Date());
            Thread.sleep(5000);
            System.out.println("结束吃饭?... " + new Date());
        }

        private static void drink() throws Exception {
            System.out.println("开始喝酒?️... " + new Date());
            Thread.sleep(5000);
            System.out.println("结束喝酒?... " + new Date());
        }
    }

    多线程创建方式

        继承 Thread
        实现 Runable
        实现 Callable

    ①:继成java.lang.Thread, 重写run()方法

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

    class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
        }
    }

     
    Thread 类

    package java.lang;
    public class Thread implements Runnable {
        // 构造方法
        public Thread(Runnable target);
        public Thread(Runnable target, String name);
        
        public synchronized void start();
    }


    Runnable 接口

    package java.lang;

    @FunctionalInterface
    public interface Runnable {
        pubic abstract void run();
    }


    ②:实现java.lang.Runnable接口,重写run()方法,然后使用Thread类来包装

    public class Main {
        public static void main(String[] args) {
             // 将Runnable实现类作为Thread的构造参数传递到Thread类中,然后启动Thread类
            MyRunnable runnable = new MyRunnable();
            new Thread(runnable).start();
        }
    }

    class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + " " + Thread.currentThread().getId());
        }
    }

  • 相关阅读:
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    WPF DelegateCommand 出现Specified cast is not valid
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    win10 sdk 是否向下兼容
    PHP extract() 函数
    PHP end() 函数
    PHP each() 函数
    PHP current() 函数
  • 原文地址:https://www.cnblogs.com/sy130908/p/11504925.html
Copyright © 2011-2022 走看看