zoukankan      html  css  js  c++  java
  • 并发与并行

        一:前段时间在学习多线程,其实有次面试别人问我有关并发的问题,问我知不知道并发的知识,其实我不懂,我觉得那时候的我还是没有理解什么事并发,甚至我还没有懂什么事线程,什么事进程等,所以就专门写下这篇知识加载下来吧。

      二:内容

        (1)进程:

          

    这是我的电脑里面的任务管理器的进程,看见里面有QQ,360,暴风等进程,这样一个一个的就是进程。那么什么是线程了。

    (2)、线程是在进程的基础上才有的,有了进程才会有线程,所以可以这么说,线程消失了则进程不一定消失,但是进程消失了则线程肯定消失。至于在说通俗点,我个人会这么认为,比如你登陆QQ后跟别人聊天,那么聊天者就是在QQ进程中的一个线程。

    (3)、并发:并发的含义是指--->说简单点就是多线程抢占资源的过程,就像你在和多个人聊天,但是同一个时间,你只能回复一个人的消息,其他的消息框都是在等待你的回复,那么这些消息框交替的等待消息的过程实际上就是差不多在抢占资源的过程,谁抢到了谁就用。这是讲究时间段的,同一时刻不可能同时做这几件事情。在电脑里面,并发是指一个或者多个cpu在若干程序之间使用,即是,在有限的资源下使得多个用户可以共同使用。

    (4)、并行:并行是指在同一时刻可以同时发生的,比如现在又A,B,C,D四个人,A和B聊天,C和D聊天,在同一时刻A和B在聊天,在这时刻C与D也可以聊天的,这叫做同一时间同时发生的。在电脑上,并发性使得多个程序同一时刻在不同cpu上同时执行

    三:线程(Thread和Runnable)

      想要实现多线程,那么可以继承Thread和实现Runnable接口

    下面我们先看看继承Thread父类看看效果

    package org.wh.ThreadDemo01;
    
    public class MyThread extends Thread {
        private String name;
        public MyThread(String name){
            this.name=name;
        }
        
        public void run(){
            for(int i=0;i<10;i++){
                System.out.println(name+"--运行->"+i);
            }
        }
    }
    package org.wh.ThreadDemo01;
    
    public class ThreadDemo01 {
        public static void main(String args[]){
            MyThread m1=new MyThread("A");
            MyThread m2=new MyThread("B");
            m1.start();//m1.run()也行
            m2.start();//m2.run()也行
        }
    }
    结果:
    A--运行->0 B--运行->0 A--运行->1 A--运行->2 A--运行->3 A--运行->4 A--运行->5 A--运行->6 A--运行->7 A--运行->8 A--运行->9 B--运行->1 B--运行->2 B--运行->3 B--运行->4 B--运行->5 B--运行->6 B--运行->7 B--运行->8 B--运行->9

    在看看我们实现Runnable接口

    package org.wh.RunnableDemo01;
    
    public class MyThread implements Runnable {
        private String name;
        public MyThread(String name){
            this.name=name;
        }
        
        public void run(){
            for(int i=0;i<10;i++){
                System.out.println(name+"--运行->"+i);
            }
        }
    }
    package org.wh.RunnableDemo01;
    
    public class ThreadDemo01 {
        public static void main(String args[]){
            MyThread m1=new MyThread("A");
            MyThread m2=new MyThread("B");
            new Thread(m1).start();
            new Thread(m2).start();
        }
    }
    结果:
    A--运行->0
    A--运行->1
    A--运行->2
    A--运行->3
    A--运行->4
    A--运行->5
    A--运行->6
    B--运行->0
    B--运行->1
    B--运行->2
    B--运行->3
    B--运行->4
    B--运行->5
    B--运行->6
    B--运行->7
    B--运行->8
    B--运行->9
    A--运行->7
    A--运行->8
    A--运行->9

    对于这两个我们可以看出,在Thread中我们并没有看出是多线程,在Runnable中我们可以看出多线程的表现,A和B交替运行。

    使用Thread类在操作多线程的时候无法达到资源共享的目的,使用Runnable接口实现的多线程操作可以实现资源共享。

    在Thread中,我们看了Thread可以发现,在调用run()方法的实质是调用start0()方法,下面看看这段源码

     public synchronized void start() {
            /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added 
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
             */
            if (threadStatus != 0 || this != me)
                throw new IllegalThreadStateException();
            group.add(this);
            start0();
            if (stopBeforeStart) {
            stop0(throwableFromStop);
        }
        }
    
        private native void start0();

    其中可以看出,如果一个线程已经启动了,那么我们再起启动,则会抛出异常。

    我们主要记住修饰start0()方法的native这个修饰符

    NATIVE:native关键字表示的是一个由java调用本机操作系统函数的一个关键字,在java中,运行java程序调用本机的操作系统的函数以完成特定的功能。

    四:结尾

      今天我要转正,发了转正申请,但是工资还是很低,所以我想要把工资加到4k,因为我没经验,刚刚出来,还没毕业,现在才大四,要个4k应该还行吧。我是很想把这半年搞完的,希望可以。。。

    ***********************************

    姓名:吴浩

    名言:机会是留给有准备的人的

    ************************************

  • 相关阅读:
    正则表达式---用户验证
    最短路 Dijkstra
    最短路 Dijkstra+堆优化
    LCIS(最长公共上升子序列)
    最小生成树 Kruskal
    网络流 最大流
    网络流 最小费用最大流
    树链剖分
    树状数组
    双重Hash
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/4077011.html
Copyright © 2011-2022 走看看