并发编程(一)多线程基础

目录

  • 并发编程(一)多线程基础
  • 1、进程和线程的概念
  • 2、为什么要使用多线程
  • 3、多线程使用的场景
  • 4、多线程创建方式
    • 4.1、继承Thread类
    • 4.2、实现Runable接口
    • 4.3、匿名内部类
    • 4.4、线程池(后面细说)
  • 5、线程的声生命周期
    • 5.1、新建
    • 5.2、就绪
    • 5.3、运行
    • 5.4、阻塞
    • 5.5、死亡
  • 6、守护线程
  • 7、join方法

并发编程(一)多线程基础

1、进程和线程的概念

  • 进程:一个应用程序,在进程中会有N多个线程,进程是所有线程的集合。
  • 线程:一条执行路径。

2、为什么要使用多线程

可以提高程序运行的效率。

3、多线程使用的场景

  1. 给用户发送短信,防止调用短信接口耗时过长
  2. 打包图片压缩包

4、多线程创建方式

4.1、继承Thread类

package com.fly.thread_demo.demo_1;

/**
 * 线程创建方式一: 继承Thread类 重写run方法
 */
public class ThreadDemo_1 extends Thread{
    @Override
    public void run() {
        System.out.println("子线程开始");
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
        System.out.println("子线程结束");
    }

    public static void main(String[] args) {
        System.out.println("主线程开始");
        Thread t1 = new ThreadDemo_1();
        t1.start();
        System.out.println("主线程结束");
    }
}

4.2、实现Runable接口

package com.fly.thread_demo.demo_1;
/**
 * 线程创建方式二: 实现Runnable接口
 */
public class ThreadDemo_2 implements Runnable{
    @Override
    public void run() {
        System.out.println("子线程开始");
        for (int i = 0; i < 10; i++) {
            System.out.println("i = " + i);
        }
        System.out.println("子线程结束");
    }

    public static void main(String[] args) {
        System.out.println("主线程开始");
        //在Thread构造方法中  接受一个Runnable接口
        Thread t2 = new Thread(new ThreadDemo_2());
        t2.start();
        System.out.println("主线程结束");
    }
}

4.3、匿名内部类

package com.fly.thread_demo.demo_1;

/**
 * 线程创建方式三: 匿名类部类
 */
public class ThreadDemo_3 {

    public static void main(String[] args) {
        System.out.println("主线程开始");
        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("子线程开始");
                for (int i = 0; i < 10; i++) {
                    System.out.println("i = " + i);
                }
                System.out.println("子线程结束");
            }
        });
        t3.start();
        System.out.println("主线程结束");
    }
}

4.4、线程池(后面细说)

5、线程的声生命周期

5.1、新建

? new Thread();

5.2、就绪

? 调用start方法后,执行run方法前,等待cpu分配资源

5.3、运行

? 执行run方法

5.4、阻塞

  1. 调用sleep方法
  2. 调用阻塞式IO
  3. 调用wait方法

5.5、死亡

  1. run方法执行完毕
  2. 抛出异常
  3. 调用stop方法 (容易造成死锁,不推荐使用)

6、守护线程

package com.fly.thread_demo.demo_1;

/**
 * 非守护线程:主线程死亡,不影响  非守护线程
 * 守护线程:主线程死亡,守护线程同时死亡
 */
public class ThreadDemo_4 implements Runnable{
    @Override
    public void run() {
        System.out.println("子线程开始");
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("i = " + i);
        }
        System.out.println("子线程结束");
    }

    public static void main(String[] args) {
        System.out.println("主线程开始");
        Thread t4 = new Thread(new ThreadDemo_4());
        t4.setDaemon(true);//把t4设置为守护线程 (可以对比  设置和设置的区别)
        t4.start();
        try {
            Thread.sleep(300);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束");
    }
}

7、join方法

package com.fly.thread_demo.demo_1;

/**
 *  join :
 *      1) 线程同步,是并行的线程编程串行,在A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行
 *      2) 在start方法调用之后调用
 *      3) 实现原理:调用线程的wait方法来达到同步的目的
 */
public class ThreadDemo_5 {

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 30; i++) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("子线程i = " + i);
                }
            }
        });

        t1.start();
        try {
            //(可以对比  设置和设置打印结果的区别)
            t1.join(); //在主线程中调用t1的join方法   表示让t1先执行完毕再执行主线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        for (int i = 0; i < 10; i++) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("主i = " + i);
        }
    }
}
package com.fly.thread_demo.demo_1;

/**
 * 面试题  现在有3个线程 t1 ,t2,t3   如何让t1 执行完毕 再执行 t2  t2执行完毕再执行t3
 */
public class ThreadDemo_6 {

    public static void main(String[] args) {

        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("t1:i = " + i);
                }
            }
        });
        t1.start();

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t1.join();//t2 中 调用 t1.join() :让t1执行完毕执行t2
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < 10; i++) {
                    System.out.println("t2:i = " + i);
                }
            }
        });
        t2.start();

        Thread t3 = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    t2.join();//t3中 调用 t2.join() :让t2执行完毕执行t3
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                for (int i = 0; i < 10; i++) {
                    System.out.println("t3:i = " + i);
                }
            }
        });
        t3.start();
    }
}

原文地址:https://www.cnblogs.com/bigfly277/p/10200428.html

时间: 2024-08-27 23:29:48

并发编程(一)多线程基础的相关文章

python并发编程之多线程基础知识点

1.线程理论知识 概念:指的是一条流水线的工作过程的总称,是一个抽象的概念,是CPU基本执行单位. 进程和线程之间的区别: 1. 进程仅仅是一个资源单位,其中包含程序运行所需的资源,而线程就相当于车间的流水线,负责执行具代码. 2. 每个进程至少包含一个线程,由操作系统自动创建,称之为主线程 3. 每个进程可以有任意数量的线程 4.创建进程的开销要比创建进程小得多 5. 同一进程的线程间数据是共享的 6.线程之间是平等的,没有子父级关系,同一进程下的各线程的PID相同 7. 创建线程的代码可以写

并发编程(01)--多线程基础

1.关于多线程 1.1 线程与进程的区别 进程:系统中每一个正在运行的程序都是一个进程,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元 线程:是一组指令的集合,控制着进程的执行,一个进程中至少有一个线程 1.2 为什么用多线程 使用多线程可以将执行时间长的程序中的任务放到后台去处理,在一些需要等待的任务上如文件读写.网络分发数据等,使用多线程就可以更好的利用CPU的资源,从而提高程序运行的效率 2. 线程的状态 线程有5种状态:新建.就绪.运行.阻塞.死亡,如下图所示:

并发编程之多线程基础篇及面试

线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务.通常由操作系统负责多个线程的调度和执行. 使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下可以释放一些珍贵的资源如内存占用等等. 如果有大量

并发编程之多线程基础-Thread和Runnable的区别及联系(二)

上篇文章讲述了创建线程的常用方式 本篇主要分析一下Thread和Runnable两种方式创建线程的区别及联系 联系: ?Thread类实现了Runable接口. ?都需要重写里面Run方法. 区别: ?Thread方式不支持多继承,Runnable方式支持多个实现 ?Runnable更容易实现资源共享,能多个线程同时处理一个资源. 疑惑分享: 本人在理解他们区别的时候 考虑到Thread类本身就是Runnable的实现类 所以产生了一个疑惑:- 为什么Runnable可以实现共享而Thread却

day10-python并发编程之多线程协程及MySQL

第1章 python并发编程之多线程 1.1 死锁现象与递归锁 1.1.1 死锁概念 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 1.1.2 博客实例 from threading import Thread,Lock import time mutexA=L

并发编程之多线程

一.并发编程之多线程 1.线程简单介绍 进程是资源单位,把所有资源集中到一起,而线程是执行单位,真正执行的是线程 每个进程都有一个地址空间,而且默认就有一个控制线程 多线程:在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间.进程之间是竞争关系,线程之间是协作关系 线程的创建开销比进程小很多,运行较快 主线程从执行层面上代表了其所在进程的执行过程 2.线程开启方式 方式一:使用替换threading模块提供的Thread from threading import Thread  d

python 学习_第四模块 并发编程(多线程)

python 学习_第四模块 并发编程(多线程) 1  开启线程方式 from threading import Thread import time def say(name): time.sleep(2) print("%s hello"%name) if __name__ =="__main__": t = Thread(target=say,args=("alex",)) t.start() print("主线程")

Python并发编程04/多线程

目录 Python并发编程04/多线程 1.生产消费者模型 2.线程的理论知识 2.1什么是线程 2.2线程vs进程 2.3线程的应用 3.开启进程的两种方式 3.1第一种方式 3.2第一种方式 4.线程vs进程的代码对比 4.1开启速度对比 4.2对比pid 4.3同一个进程内线程共享内部数据 5.线程的其他方法 6.join与守护线程 6.1join 6.2守护线程 7.互斥锁 Python并发编程04/多线程 1.生产消费者模型 #编程思想,模型,设计模式,理论等等,都是交给你一种编程的方

Java并发编程之多线程同步

线程安全就是防止某个对象或者值在多个线程中被修改而导致的数据不一致问题,因此我们就需要通过同步机制保证在同一时刻只有一个线程能够访问到该对象或数据,修改数据完毕之后,再将最新数据同步到主存中,使得其他线程都能够得到这个最新数据.下面我们就来了解Java一些基本的同步机制. Java提供了一种稍弱的同步机制即volatile变量,用来确保将变量的更新操作通知到其他线程.当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.然而,在访问volatile变量时不会执行加锁操作

Java并发编程、多线程、线程池…

Java多线程干货系列(1):Java多线程基础http://www.importnew.com/21136.html#comment-651146 40个Java多线程问题总结http://www.importnew.com/18459.html#comment-651217 Java线程面试题 Top 50http://www.importnew.com/12773.html Java并发编程:Thread类的使用http://www.cnblogs.com/dolphin0520/p/39