线程和进程

曾经终败给现在 2024-04-01 01:38 162阅读 0赞

目录

进程

线程

实现多线程的方法

方式一:继承Thread类

设置和获取线程名称

线程调度

线程控制

线程的状态(生命周期)

方式二:实现Runnable接口


进程

进程:是正在运行的程序

  • 是系统进行资源分配和调用法人独立单位
  • 每一个进程都有它自己的内存空间和系统资源

线程

线程:是进程中的单个顺序控制流,是一条执行路径

  • 单线程:一个进程如果只有一条执行路径,则称为单线程程序
  • 多线程:一个程序如果有多条执行路径,则称为多线程程序

实现多线程的方法

方式一:继承Thread类

  • 定义一个类MyThread继承Thread类
  • 在MyThread类中重写run()方法
  • 创建MyThread类的对象
  • 启动线程

    public class MyThread extends Thread{

    1. @Override
    2. public void run() {
    3. for (int i = 0; i < 100; i++) {
    4. System.out.println(i);
    5. }
    6. /**
    7. * 为什么要重写run()方法
    8. * run()方法是用来封装被线程执行的代码
    9. * */
    10. }

    }

    public class MyThreadDemo {

    1. public static void main(String[] args) {
    2. MyThread my1 = new MyThread();
    3. MyThread my2 = new MyThread();
    4. /* my1.run();
    5. my2.run();*/
    6. my1.start();
    7. my2.start();
    8. /**
    9. *run()方法和start()方法的区别
    10. * run():封装线程执行的代码,直接调用,相当于普通方法的调用
    11. * start():启动线程,然后有jvm调用此线程的run方法
    12. * */
    13. }

    }

    Thread类的常用方法






















































方法 说明
void run() 执行任务操作的方法

void start()

使该线程开始执行

void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
String getName() 返回该线程名称
int getPriority 返回改线程的优先级
void setPriority(int newPriority) 更改该线程的优先级
Thread.State getStata() 返回该线程的状态
boolean isAlive() 测试线程是否处于活动状态
void join() 等待该线程终止
void interrupt() 中断线程
void yield() 暂停当前正在执行的线程对象,并执行其他线程

设置和获取线程名称

Thread类中设置和获取进程名称的方法

方法一:

  • setName(String name):将此线程的名称更改为等于参数name
  • String getName():返回此线程的名称

方法二 :

  • Thread类的有参构造来设置名称,通过getName获取值

方法三:

  • 静态的currentThread()的方法得到当前正在执行的线程对象,通过这个对象去调用getName()获取线程名称

    public class MyThread extends Thread {

  1. public MyThread() {
  2. }
  3. public MyThread(String name) {
  4. super(name);
  5. }
  6. @Override
  7. public void run() {
  8. for (int i = 0; i < 10; i++) {
  9. System.out.println(getName() + ":" + i);
  10. }
  11. }
  12. }
  13. public class MyThreadDemo {
  14. public static void main(String[] args) {
  15. MyThread my1 = new MyThread();
  16. MyThread my2 = new MyThread();
  17. my1.setName("线程一:");
  18. my2.setName("线程二:");
  19. //Thread(String name)
  20. MyThread my1 = new MyThread("线程一:");
  21. MyThread my2 = new MyThread("线程二:");
  22. my1.start();
  23. my2.start();
  24. //currentThread()返回当前正在执行的线程对象的引用
  25. System.out.println(Thread.currentThread().getName());//main
  26. }

线程调度

线程有两种调度模型

  • 分时调度模型:所有的线程轮流使用CPU的使用权,平均分配每个线程占用 CPU的时间片
  • 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU时间片相对多一些

Java使用的是抢占式调度模型

多线程程序执行是有随机性的,因为谁抢到CPU的使用权是不一定的

Thread类中设置和获取线程优先级的方法

  • public final int getPriority():返回此线程的优先级
  • public final void setPriority(int newPriority):更改此线程的优先级

    线程默认优先级是:**5;线程的优先级范围是:1-10**

线程优先级高仅仅表示线程获取CPU时间片的几率高

  1. public class MyThread extends Thread {
  2. @Override
  3. public void run() {
  4. for (int i = 0; i < 10; i++) {
  5. System.out.println(getName() + ":" + i);
  6. }
  7. }
  8. }
  9. public class MyThreadDemo {
  10. public static void main(String[] args) {
  11. MyThread my1 = new MyThread();
  12. MyThread my2 = new MyThread();
  13. MyThread my3 = new MyThread();
  14. //setName(String name):将此线程的名称更改为等于参数name
  15. my1.setName("线程一:");
  16. my2.setName("线程二:");
  17. my3.setName("线程三:");
  18. /**
  19. //public final int getPriority():返回此线程的优先级
  20. int priority = my1.getPriority();
  21. int priority1 = my2.getPriority();
  22. int priority2 = my3.getPriority();
  23. System.out.println(priority);//5
  24. System.out.println(priority1);//5
  25. System.out.println(priority2);//5
  26. //public final void setPriority(int newPriority):更改此线程的优先级
  27. System.out.println(Thread.MAX_PRIORITY);//10
  28. System.out.println(Thread.MIN_PRIORITY);//1
  29. System.out.println(Thread.NORM_PRIORITY);//5
  30. */
  31. my1.setPriority(Thread.MIN_PRIORITY);
  32. my2.setPriority(Thread.MAX_PRIORITY);
  33. my3.setPriority(Thread.NORM_PRIORITY);
  34. my1.start();
  35. my2.start();
  36. my3.start();
  37. }
  38. }

线程控制






















方法名 说明
void sleep(long millis) 使当前正在执行的线程停留(暂停执行)指定的毫秒数

void jion

等待这个进程死亡
void setDaemon(boolean on) 将此线程标记为守护线程,当运行的线程都是守护线程时,Java虚拟机将退出
  1. /**
  2. sleep&join
  3. */
  4. public class MyThread2 implements Runnable {
  5. @Override
  6. public void run() {
  7. System.out.println("线程正在运行,处于运行状态");
  8. System.out.println("线程开始休眠,线程阻塞状态");
  9. try {
  10. Thread.sleep(5000);
  11. System.out.println("线程休眠结束,线程阻塞状态结束,再次进入就绪状态");
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. public static void main(String[] args) {
  17. MyThread2 runable = new MyThread2();
  18. Thread thread = new Thread(runable);
  19. System.out.println("线程处于创建状态!");
  20. thread.start();
  21. System.out.println("线程处于就绪状态!");
  22. }
  23. }
  24. public class JoinTest {
  25. public static void main(String[] args) {
  26. MyThread2 runable = new MyThread2();
  27. Thread t = new Thread(runable, "mythread2");
  28. t.start();
  29. //循环打印,main做的事
  30. for (int i = 1; i <= 20; i++) {
  31. System.out.println(Thread.currentThread().getName()+" : "+i);
  32. if (i==3){
  33. try {
  34. t.join();
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. Thread.yield();
  39. t.interrupt();
  40. }
  41. }
  42. }
  43. }
  44. /**
  45. setDaemon
  46. */
  47. public class ThreadDaemon extends Thread {
  48. @Override
  49. public void run() {
  50. for (int i = 0; i < 10; i++) {
  51. System.out.println(getName() + ":" + i);
  52. }
  53. }
  54. public static void main(String[] args) {
  55. ThreadDaemon td1 = new ThreadDaemon();
  56. ThreadDaemon td2 = new ThreadDaemon();
  57. td1.setName("线程一");
  58. td2.setName("线程二");
  59. //设置主线程为线程主
  60. Thread.currentThread().setName("线程主");
  61. //设置守护线程
  62. td1.setDaemon(true);
  63. td2.setDaemon(true);
  64. td1.start();
  65. td2.start();
  66. for (int i = 0; i < 10; i++) {
  67. System.out.println(Thread.currentThread().getName()+":"+i);
  68. }
  69. }
  70. }

线程的状态(生命周期)

线程的生命周期可以分为4个阶段,即线程的4种状态,分别为新生状态,可运行状态,阻塞状态和死亡状态。一个具有生命的线程,总是处于4种状态之一。

423e3259d3714f6a8c7e58d1d8d749c2.png

方式二:实现Runnable接口

  • 定义一个类MyRunnable实现Runnable接口
  • 在MyRunnable类中重写run()方法
  • 创建MyRunnable类的对象
  • 创建Thread类的对象,把MyRunnable对象作为构造方法的参数
  • 启动线程

    public class MyRunnableDemo implements Runnable{

    1. @Override
    2. public void run() {
    3. for (int i = 0; i < 10; i++) {
    4. System.out.println(Thread.currentThread().getName()+":"+i);
    5. }
    6. }
  1. public static void main(String[] args) {
  2. //创建MyRunnable类的对象
  3. MyRunnableDemo mr = new MyRunnableDemo();
  4. //创建Thread类的对象,把MyRunnable对象作为构造方法的参数
  5. //Thread(Runnable target)
  6. // Thread t1 = new Thread(mr);
  7. // Thread t2 = new Thread(mr);
  8. //Thread(Runnable target,String name)
  9. Thread t1 = new Thread(mr, "线程一");
  10. Thread t2 = new Thread(mr, "线程二");
  11. t1.start();
  12. t2.start();
  13. }
  14. }

多线程的实现方案有两种:

  • 继承Thread
  • 实现Runnable接口

相比继承Thread类,实现Runnable接口的好处:

  • 避免了Java单继承的局限性
  • 适合多个相同程序的代码去处理同一资源的情况,把线程和程序代码、数据有效分离,较好的体现了面向对象的设计思想

发表评论

表情:
评论列表 (有 0 条评论,162人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线进程

    目录 进程 线程 实现多线程的方法 方式一:继承Thread类 设置和获取线程名称 线程调度 线程控制 线程的状态(生命周期) 方式二:实现Runnab

    相关 线进程

    一、概念: 进程:进程是一个具有一定独立功能的程序在一个数据集合上依次动态执行的过程。进程是一个正在执行的程序的实例,包括程序计数器、寄存器和程序变量的当前值。 线程:进程

    相关 线进程

    目录 一、线程和进程的区别 二、线程 三、分时操作系统 四、如何减少上下文切换 五、多线程和单线程 六、多线程的使用场景 --------------------

    相关 线进程

    线程和进程 一、线程和进程 线程是CPU调度和分派的基本单位。 进程对于操作系统来说就是一个任务。 听起来挺难懂的一句话,我们举一个实际例子:比如现在有一条需要

    相关 进程线

    1.概念 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位

    相关 进程线

    进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内调度实体。比进程更小的独立运行

    相关 进程线

    进程和线程 开发工具与关键技术:java 撰写时间:2019/5/15 进程和线程 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间

    相关 进程线

    进程和线程 概念 进程就是操作系统中执行的一个程序,操作系统以进程为单位分配存储空间,每个进程都有自己的地址空间、 数据栈以及其他用于跟踪进程执行的

    相关 线进程

    1.定义 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它