计算机是如何工作的&多线程

1.冯诺依曼结构体系:

  1. 运算器
  2. 控制器
  3. 存储器
  4. 输入设备
  5. 输出设备

2.操作系统

  1.  向上为应用程序提供一个稳定的运行环境

  2. 向下管理所有的硬件设备

  3. 为用户提供一个人机交互的界面

3.进程 

     每一个运行起来的程序(软件),操作系统都会以进程的形式把它管理起来。

每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1-n个线程)(进程是资源分配的最小单位)。

 

 面试题:请你说一下什么是并发,什么是并行?

           并发:一会干这件事,一会干那件事(同时只能干一件事)

           并行:一边干这件事,一边干那件事(真正意义上的同时进行)

在编程方面。我们并不区分是并行还是并发,统一称为并发编程。

 4.虚拟内存空间:进程启动之后会申请内存空间。

 由于MMU的限制,导致进程之间不能够互相访问内存。

一、多线程

线程:同一个类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是CPU调度的最小单位)。

       线程和进程一样分为5个阶段:创建、就绪、运行、阻塞、终止。

       多进程是指操作系统能同时运行多个任务(程序)。

        多线程是指在同一程序中有多个顺序流在执行。

1. 多进程处理一个复杂或很大的任务。

当进程启动时:

1.申请内存;2.申请文件资源;3.加PCB加到链表中。

当进程结束时:

1.释放文件;2.释放内存;3.从链表中删除PCB

但是:这些申请也释放资源的操作是非常耗时的

         为了解决资源消耗问题,提出一个轻量级进程的概念(线程 ),创建线程只需要关注要处理的任务,使用的是进程创建时申请到的所有资源。

 使用多线程编程的原因:

  1. 充分利用CPU资源
  2. 利用轻量级进程的特性减少系统性能的开销
  3. 线程创建的效率比进程高
  4. 线程销毁的效率比进程高
  5. 线程调度的效率比进程高

2. 多线程可能存在的问题

3.创建线程:通过JDK给我们提供的API来创建线程 

 线程:JAVA中的类。不是系统中真正的PCB

     1.继承Thread类

如果说你只是想起一条线程,没有什么其他特殊的要求,那么可以使用Thread。

 

 

举例说明: 

public class Thread1 extends Thread{
    private String name;

    public Thread1(String name) {
        this.name = name;
    }
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(name + "运行   :   "  + i);
            try{
                sleep((int) Math.random() * 10);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}
public class Main {
    public static void main(String[] args) {
        Thread1 mTh1=new Thread1("A");
        Thread1 mTh2=new Thread1("B");
        mTh1.start();
        mTh2.start();
    }
}

 

 

 说明:程序启动运行main的时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建,随着调用两个对象的start方法时,另外两个线程也启动了,这样,整个应用就在多线程下运行。

注意:start()方法的调用后并不是立即执行多线程代码,而是使得线程变为可运行态(Runnable),什么时候运行是由操作系统决定。

从程序的运行结果来看,多线程是乱序执行,因此,只有乱序执行的代码才有必要设计为多线程。

Thread。sleep()方法调用的目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。

实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。

 

 start方法重复调用的话。会出现Exception in thread "main" java.lang.IllegalThreadStateException 异常。

 2.实现Runnable接口并重写run()

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值