• Java学习笔记 --- 多线程


    一、线程相关概念 

    程序

            程序是为完成特定任务,用某种语言编写的一组指令的集合。简单的说就是我们写的代码

    进程

            1、进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存空间。当我们使用迅雷,又启动了一个进程,操作系统将为迅雷分配新的内存空间

            2、进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:是它自身的产生、存在和消亡的过程

    什么是线程

            1、线程是由进程创建的,是进程的一个实体

            2、一个进程可以拥有多个线程

    其它相关概念

            1、单线程:同一个时刻,只允许执行一个线程

            2、多线程:同一个时刻,可以执行多个线程。比如:一个qq进程可以同时打开多个聊天窗口,一个迅雷进程可以同时下载多个文件

            3、并发:同一个时刻,多个任务交替执行,造成一种“貌似同时”的错觉,简单的说,单核cpu实现的多任务就是并发

            4、并行:同一个时刻,多个任务同时执行。多核cpu可以实现并行

    二、线程基本使用

            在java中线程来使用有两种方法

    继承Thread类,重写run方法

    1. import java.util.ArrayList;
    2. /**
    3. * 演示通过继承 Thread 类创建线程
    4. */
    5. public class Thread01 {
    6. public static void main(String[] args) throws InterruptedException {
    7. //创建Cat对象,可以当作线程使用
    8. Cat cat = new Cat();
    9. /* start()方法源码解读
    10. 1. 调用start0();
    11. public synchronized void start() {
    12. start0();
    13. }
    14. 2. start0() 是本地方法,是JVM调用,底层是c/c++实现
    15. 真正实现多线程效果的是 start0() 方法,而不是run
    16. private native void start0();
    17. */
    18. cat.start();//启动线程 -> 最终会执行cat的run方法
    19. //cat.run();//run方法就是一个普通的方法,没有真正启动一个线程,把run方法执行完毕,才会向下执行
    20. //当 main 线程启动了一个子线程,主线程不会阻塞,会继续执行
    21. //这时主线程和子线程是交替执行
    22. System.out.println("主线程继续执行" + Thread.currentThread().getName());
    23. for (int i = 0; i < 10; i++) {
    24. System.out.println("主线程 i=" + i);
    25. //让主线程休眠一秒
    26. Thread.sleep(1000);
    27. }
    28. }
    29. }
    30. //当一个类继承了Thread 该类就可以当做线程使用
    31. //重写run方法,写上自己的业务代码
    32. //run方法 是 Thread 类实现了 Runnable 接口的run方法
    33. /*
    34. @Override
    35. public void run() {
    36. if (target != null) {
    37. target.run();
    38. }
    39. }
    40. */
    41. class Cat extends Thread {
    42. int times = 0;
    43. @Override
    44. public void run() {//重写run方法,写上自己的逻辑
    45. while (true) {
    46. System.out.println("喵喵喵~~~" + ++times + " 线程名=" + Thread.currentThread().getName());
    47. //让线程休眠1秒
    48. try {
    49. Thread.sleep(1000);
    50. } catch (InterruptedException e) {
    51. e.printStackTrace();
    52. }
    53. if (times == 8) {//当times到8次时就退出循环,线程也就退出
    54. break;
    55. }
    56. }
    57. }
    58. }

    实现Runnable接口,重写run方法

            1、Java是单继承的,在某些情况下一个类可能已经继承了某个父类,这时在用继承Thread类方法来创建线程显然已经不可能了  

            2、Java设计者们提供了另一个方式创建线程,就是通过实现Runnable接口来创建线程

    1. import sun.rmi.runtime.RuntimeUtil;
    2. /**
    3. * 通过实现Runnable接口,来开发线程
    4. */
    5. public class Thread02 {
    6. public static void main(String[] args) throws InterruptedException {
    7. Dog dog = new Dog();
    8. //dog对象不能直接调用start()方法
    9. //创建了Thread对象,把dog对象(实现了Runnable),放入Thread
    10. Thread thread = new Thread(dog);
    11. thread.start();
    12. Tiger tiger = new Tiger();//实现了Runnable
    13. ThreadProxy threadProxy = new ThreadProxy(tiger);
    14. threadProxy.start();
    15. }
    16. }
    17. class Animal {}
    18. class Tiger extends Animal implements Runnable {
    19. @Override
    20. public void run() {
    21. System.out.println("老虎叫!!!");
    22. }
    23. }
    24. //线程代理类 模拟了一个极简的Thread
    25. class ThreadProxy implements Runnable {
    26. private Runnable target = null;//属性 类型是Runnable
    27. @Override
    28. public void run() {
    29. if (target != null) {
    30. target.run();
    31. }
    32. }
    33. public ThreadProxy(
  • 相关阅读:
    atrace和systrace的基本使用方法
    Revit二次开发——族的基础
    Pytorch(一)——Pytorch基础知识
    VC编译错误:error LNK2019: 无法解析的外部符号 __imp__qsort,
    在Java中使用FileReader.read()进行读取文件时,为什么乱码?两个方法解决
    Go实战学习笔记-1.3流程控制
    【数据库】03——初级开发需要掌握哪些SQL语句
    KMP字符串匹配算法
    微软出品自动化神器【Playwright+Java】系列(五) 之 常见点击事件操作
    安全狗陈奋:数据安全需要建立在传统网络安全基础之上
  • 原文地址:https://blog.csdn.net/a1404359447/article/details/127848969