Java-进程和线程

1.进程

> 是一个独立运行应用程序
>
> ​        比如电脑软件,启动起来以后,就是一个进程  qq  微信  等
>
> 进程 需要系统进行分配的,可以获取当前系统内存  网卡  显卡等
>
> ​    1.独立性
>
> ​            各个进程之间是互相独立的,互相不影响的。
>
> ​    2.互斥性
>
> ​            每个应用程序(软件) 系统分配一个独立的端口号如果一个软件qq端口号  97    idea端口也叫97
>
> 写代码  Demo1  里面 main主函数     Demo1可以看成一个应用程序 就是一个进程

 2.线程

进程是由至少一个或者多个线程组成的。

线程是进程最小的基本单位。

线程的特性:

1、抢占式运行,当多个线程执行时,随机执行某个线程

            给程序 分配CPU,按照时间片来执行,单位时间片抢占式执行的。随机抢占的

2、资源共享,同一个进程,有多个线程,这个多个线程是可以共享同一个数据的

        

​    Java程序:Demo1可以看成一个进程,

​                    一个Java程序中有两个线程:

​                        1.main 主线程

​                        2.垃圾回收的线程

面试题:进程和线程的区别

进程就像是一座大厂,有自己的厂房(内存空间)、工人(线程)和设备(系统资源),比如工人要使用设备需要去配给他,不同大厂之间、设备互不影响,通信需要通过快递(IPC)来实现。而线程就像是大厂里的工人,多个工人共享工厂里的设备和工作区域,能够同步协作完成任务。进程的主要区别是进程是独而线程是同一进程内的共享资源。线程之间的切换比进程快,但也面临着线程安全等问题,需要特殊处理。 

 3.并行和并发

并行和并发都可以描述同时处理多个任务,但它们的方式不同。


并行:是指同时执行多个任务,每个任务分配有独立的计算机核心或处理器来处理,各任务同时进行并在同一时间完成。可以类比成一条生产线上的多个工人同时完成生产任务,提高工作效率,节省时间。(同时执行)


并发:是指同时执行多个任务,但在同一时间点内只有一个任务能够被处理,任务之间通过快速的切换使得看起来像是同时执行。可以类比成一台机器同时进行打印和扫描工作,系统快速地在打印和扫描任务之间进行切换,看起来是同时进行的。(同时发生,轮流交替执行)


简单来说,就是并行是真正的同时处理多个任务,而并发是通过快速切换,在同一时间点内模拟同时处理多个任务。

 4.创建线程的两种方式

1、继承Thread类,重写 run方法    实例化Thread子类,然后启动一个线程   start()
 2、实现Runnable接口, 重写 run方法   实例化Runnable接口的实现类。然后作为参数给Thread实例 然后启动start() 

创建线程的第一种:

        创建一个新的执行线程有两种方法。 一个是将一个类声明为Thread的子类。 这个子类应该重写run方法Thread 。 然后可以分配并启动子类的实例。

package com.qf.a_thread;


//1.一个是将一个类声明为`Thread`的子类
class MyThread1 extends Thread {
    //2.重写run方法
    @Override
    public void run() {
        //这个线程中干了打印100次的MyThread1线程:
        for (int i = 0; i < 10000; i++) {
            System.out.println("MyThread1线程:" + i);
        }
    }
}
class MyThread2 extends  Thread {
    @Override
    public void run() {
        //这个线程中干了打印100次的MyThread2线程:
        for (int i = 0; i < 10000; i++) {
            System.out.println("MyThread2线程:" + i);
        }
    }
}
public class Demo1 {
    public static void main(String[] args) {
        //3.新建线程的实例
        MyThread1 myThread1 = new MyThread1();
        //4.启动线程  启动
        myThread1.start();
        MyThread2 myThread2 = new MyThread2();
        myThread2.start();

        for (int i = 0; i < 10000; i++) {
            System.out.println("主线程" + i);
        }

    }
}

 练习:  新建两个线程,一个线程打印99乘法表,另外一个线程打印直接三角形

package com.qf.a_thread;


class MyThread3 extends Thread {
    @Override
    public void run() {
        for (int i = 1; i < 10; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "*" + i + "=" + i*j + "\t");
            }
            System.out.println();
        }
    }
}
class MyThread4 extends Thread {
    @Override
    public void run() {
        for (int i = 1; i < 10 ; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}
public class Demo2 {
    public static void main(String[] args) {
        new MyThread3().start();
        new MyThread4().start();
    }
}

第二种创建方式:

另一种方法来创建一个线程是声明实现类`Runnable`接口。 那个类然后实现了`run`方法。 然后可以分配类的实例,在创建`Thread`时作为参数传递,并启动。 

package com.qf.b_thread;


//声明实现`Runnable`接口的类
class MyThread1 implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值