zoukankan      html  css  js  c++  java
  • 谈谈你对Java多线程的理解以及多线程的实现方式

    说线程之前先说进程,何为进程?进程就是正在进行中的程序.
    比如电脑同时在运行QQ进程、cmd进程、wps进程、飞秋进程等。
    在某一时刻,CPU只能执行一个程序,只是在做快速切换,我们肉眼看不出来。

    比如:我有一些箱子,我一个人去搬,搬了一个又一个,很累,如果有5个人一起搬,就更快了
    5个人同时去搬都在一个进程中完成,这5个人叫线程,线程是进程中的内容。

    进程:是一个正在执行中的程序
    每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

    线程:就是进程中的一个独立的控制单元。
    线程在控制着进程的执行。
    一个进程中至少有一个线程,至少有一个控制单元。

    java VM 启动的时候会有一个进程java.exe,该进程中至少有一个线程负责Java程序的执行
    而且这个线程运行的代码存在于main方法中,该线程称之为主线程。
    JVM启动不止一个线程,还有负责垃圾回收机制的线程。

    任何一个代码执行的时候都会进内存,线程的控制单元依次往下执行,而负责执行的代码都在线程。
    线程的出现让我们的程序有同时出现的效果,多线程能帮我们提高效率,目的在于能使多个代码同时运行。


    线程是程序中的执行线程,Java虚拟机允许应用程序并发的运行多个线程
    每个线程都有一个优先级,高优先级线程的执行优于低优先级的线程。当某个线程中运行的代码创建一个新Thread对象时,
    该线程的初始优先级被设定为创建线程的优先级。

    从语义上去理解,想成为异常就继承exception,想成为线程就继承Thread,成为我的小弟你就是我的了,你就拥有了我所有用的属性及方法了。

    那么如何在代码中自定义一个线程?
    通过对api的查找,Java已经提供了对线程这类事务的描述,就是Thread类
    创建线程的第一种方式:继承Thread类
    步骤:
    1、定义类继承Thread
    2、覆写Thread类中的run方法
    3、调用该方法:调用线程的start方法
    该方法有两个作用:启动线程,调用run方法

    new一个对象就是在创建线程,创建了之后并没有执行,所以要调用start方法才能被执行
    那怎么执行呢?调用run方法

     而:

    可以看到,执行顺序会乱,而且每次运行的结果都不同。

    因为多个线程都在获取CPU的执行权,CPU执行到谁,谁就执行

     明确一点:在某一时刻,只能有一个程序在运行(多核除外)

     CPU在做着快速切换,以达到看上去是同时运行的效果

    我们可以形象的把多线程的运行行为是在相互争夺CPU的执行权

     多线程就一个特性:随机性,谁抢到谁执行,至于执行多长,CPU说的算

    创建线程的第二种方式:实现Runnable接口,Runnable接口定义如下:

    public interface Runnable{

      public void run();

    }

     

    线程已经创建好了,但是需要注意的是,如果想要启动一个线程肯定是 Thread类中的run()方法完成,通过观察Thread类中提供的构造方法:public
    Thread(Runnable target) 通过构造发现,Thread类可以接受Runnable子类的对象,所以一切的线程都可以通过Thread类进行启动。

    对于Thread类和Runnable接口本身都是可以进行多线程的实现,两者区别:
    1、继承局限:使用Runnable接口可以避免单继承的局限,而Thread类则有此局限
    2、资源共享:使用Runnable接口实现多线程,可以实现资源(对象属性)的共享,而Thread类无法实现

  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/lanyy/p/8629785.html
Copyright © 2011-2022 走看看