美文网首页
初识多线程

初识多线程

作者: 安安静静写代码 | 来源:发表于2017-08-12 20:45 被阅读23次

进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

什么是多线程呢?即就是一个程序中有多个线程在同时执行。
通过下图来区别单线程程序与多线程程序的不同:
 单线程程序:即,若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。如,去网吧上网,网吧只能让一个人上网,当这个人下机后,下一个人才能上网。
 多线程程序:即,若有多个任务可以同时执行。如,去网吧上网,网吧能够让多个人同时上网。

单线程和多线程区别.png

以下举几个模型图


单线程程序.JPG 迅雷下载线程原理.JPG

程序在电脑中运行原理
 分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
 抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。

实际上,CPU(中央处理器)使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是在同一时刻运行。
其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。

主线程

:jvm启动后,必然有一个执行路径(线程)从main方法开始的,一直执行到main方法结束,这个线程在java中称之为主线程。当程序的主线程执行时,如果遇到了循环而导致程序在指定位置停留时间过长,则无法马上执行下面的程序,需要等待循环结束后能够执行。
那么,能否实现一个主线程负责执行其中一个循环,再由另一个线程负责其他代码的执行,最终实现多部分代码同时执行的效果?
能够实现同时执行,通过Java中的多线程技术来解决该问题。

主线程.JPG

Thread类
Java虚拟机允许应用程序同时执行多个执行线程。 每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。 每个线程可能也可能不会被标记为守护程序。 当在某个线程中运行的代码创建一个新的Thread对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护线程。

当Java虚拟机启动时,通常有一个非守护进程线程(通常调用某些指定类的名为main的方法)。 Java虚拟机将继续执行线程,直到发生以下任一情况:

已经调用了Runtime类的exit方法,并且安全管理器已经允许进行退出操作。
所有不是守护进程线程的线程都已经死亡,无论是从调用返回到run方法还是抛出超出run方法的run 。
创建一个新的执行线程有两种方法。 一个是将一个类声明为Thread的子类。 这个子类应该重写run类的方法Thread 。 然后可以分配并启动子类的实例。 例如,计算大于规定值的素数的线程可以写成如下:


 class PrimeThread extends Thread {
     long minPrime;
     PrimeThread(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
        System.out.println("我是一个新线程");
     }
 }

然后,以下代码将创建一个线程并启动它运行:

 PrimeThread p = new PrimeThread(143);
 p.start();

Thread类的方法摘要

QQ截图20170812204217.png

思考:线程对象调用 run方法和调用start方法区别?
线程对象调用run方法不开启线程。仅是对象调用方法。线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行。

创建线程的目的是什么?
是为了建立程序单独的执行路径,让多部分代码实现同时执行。也就是说线程创建并执行需要给定线程要执行的任务。
对于之前所讲的主线程,它的任务定义在main函数中。自定义线程需要执行的任务都定义在run方法中。
Thread类run方法中的任务并不是我们所需要的,只有重写这个run方法。既然Thread类已经定义了线程任务的编写位置(run方法),那么只要在编写位置(run方法)中定义任务代码即可。所以进行了重写run方法动作。

package cn.itcast.demo;
/*
 * 创建和启动一个线程
 *    创建Thread子类对象
 *    子类调用方法start();注意:不能调用子类run()方法,
 *    子类调用run()方法并不开启线程,只能调用start方法开启线程,
 *    jvm会调用run方法在开启的线程中执行
 *    
 *    让线程程序执行  虚拟机调用线程中的run
 *   
 */
public class ThreadDemo {
       
      public static void main(String[] args) {
        SubThread st = new SubThread();
        st.start(); 
        for(int i =  0;i<50;i++)
        {
            System.out.println("Main......"+i);
        }               
    }   
}


package cn.itcast.demo;
/*
 * 定义子类 继承Thread
 * 重写方法run
 */
public class SubThread extends Thread {
 
      public void run() {
          for (int i = 0; i < 50; i++) {
            System.out.println("run...."+i);
        }
      }  
}

获取线程的名字

Thread类提供一个getName()用于返回线程的名字,currentThread(),返回主线程的名字

package cn.itcast.demo1;

import java.util.TreeSet;

public class NameThread extends Thread{

    @Override
    public void run() {
        System.out.println(super.getName());
    }
}

package cn.itcast.demo1;
/*
 * JVM开启主线程,运行方法main,主线程也是线程,是线程就必然是Thread类的对象
 * Thread类中,静态方法
 * static Thread currentThread()返回正在执行的线程对象
 */
public class ThreadDemo {

    public static void main(String[] args) {
        
        NameThread t = new NameThread();
        t.start();
        Thread t2 = Thread.currentThread();
        System.out.println(t2.getName());                       
    }

}

相关文章

  • iOS - 多线程(一):初识

    iOS - 多线程 系列文章 iOS - 多线程(一):初识iOS - 多线程(二):pthread、NSThre...

  • iOS - 多线程(二):pthread、NSThread

    iOS - 多线程 系列文章 iOS - 多线程(一):初识iOS - 多线程(二):pthread、NSThre...

  • iOS - 多线程(四):NSOperation

    iOS - 多线程 系列文章 iOS - 多线程(一):初识iOS - 多线程(二):pthread、NSThre...

  • iOS - 多线程(三):GCD

    iOS - 多线程 系列文章 iOS - 多线程(一):初识iOS - 多线程(二):pthread、NSThre...

  • 【多线程】初识多线程

    线程与进程 1.什么是进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受...

  • 初识多线程

    近几天有些时间,想来想去,决定对iOS的多线程做个总结。如果有不妥的地方大家不吝赐教!好吧,开始。 一、进程和线程...

  • 多线程初识

    线程概述 有些程序是一条直线,起点到终点;有些程序是一个圆,不断循环,直到将它切断一个运行着的程序就是一个进程或者...

  • 初识多线程

    进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具...

  • [python] 初识多线程

    背景 对于IO操作来说,多线程和多进程差别不大,甚至多线程比多进程效率更高,因为对于操作系统来说,线程的调度比多进...

  • Android初识多线程

    Android多线程 一个Android的应用程序运行在一个独立的进程中,运行在一个独立的虚拟机(dvk)上。 (...

网友评论

      本文标题:初识多线程

      本文链接:https://www.haomeiwen.com/subject/gmbjrxtx.html