博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程基本概念(2)
阅读量:3956 次
发布时间:2019-05-24

本文共 2430 字,大约阅读时间需要 8 分钟。

一)进程:

1.1  进程的定义:

     一,进程是正在运行的程序,是对一个程序的运行状态和资源占用(内存,CPU)的描述,通过进程ID区分。

     二,进程是程序的一个动态过程,它指的是从代码加载到执行完毕的一个完成过程。
     三,目前操作系统支持多进程多任务。

1.2: 进程的特点:

        a.独立性:不同的进程之间是独立的,相互之间资源不共享(举例:两个正在上课的教室有各自的财产,相互之间不共享)

        b.动态性:进程在系统中不是静止不动的,而是在系统中一直活动的;
        c.并发性:多个进程可以在单个处理器上同时进行,且互不影响;

 

二)线程

2.1:线程的定义:

      线程就是一条执行路径,是进程的组成部分,一个进程可以有多个线程每个线程去处理一个特定的子任务

2.2:线程的特点:

  •       线程的执行是抢占式的;
  •       多个线程在同一个进程中可以并发执行,其实就是CPU快速的在不同的线程之间切换,也就是说,当前运行的线程在任何时候都有可能被挂起,以便另外一个线程可以运行。
  •       每个线程的栈空间是独立的堆空间是共享的

 

三)进程和线程的关系以及区别:

  •     一个程序运行后至少有一个进程
  •     一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义的;
  •     进程间不能共享资源,但线程之间可以;
  •     系统创建进程,需要为该进程重新分配系统资源,而创建线程则容易的多,因此使用线程实现多任务并发比多进程的效率高;

 

四)线程的常用方法

4.1:设置线程的名称:

  1.      使用构造方法
  2.      setName("xxx");

4.2:获取线程的名称:

  1.       super.getName();
  2.       Thread.currentThread().getName();(推荐)

4.2:线程休眠:Thread.sleep(5000):

     使得当前正在执行的线程休眠5秒钟,释放时间片,导致线程进入阻塞状态;

     相当于将当前线程挂起5秒钟,这个操作跟线程的优先级无关,当对应的时间到了之后,还会再继续执行。

4.3:设置线程优先级 :

      可以通过设置优先级来改变线程抢到时间片的概率,优先级高的线程获得较多的执行机会

      默认情况下,每个线程的优先级都与创建它的父线程具有相同的优先级,例如:main线程具有普通优先级,则由main线程创建的子线程也有相同的普通优先级。
    注意:
    优先级范围1~10,默认为5,对应的数值越大,说明优先级越高,这个方法的设置一定要在start之前;
    线程的优先级低并不意味着争抢不到时间片,只是抢到时间片的概率比较低而已。举例:  p1.setPriority(5);

4.4:合并(加入)线程 — join:

  在执行原来线程的过程中,如果遇到了合并线程,则优先执行合并进来的线程执行完合并进来的线程后,再回到原来的任务中,继续执行原来的线程。

    特点: 线程合并,当前线程一定会释放cpu时间片,cpu会将时间片分给要Join的线程;
 eg:   joinThread.join();  //加入线程:阻塞当前线程(main),直到加入线程(joinThread)执行完毕,刚才被阻塞的当前线程才再次继续执行;

4.5:线程让步: — yield

  •   yield方法  : 暂停当前正在执行的线程对象。 
  •   yield()方法是停止当前线程,让同等优先权的线程或更高优先级的线程有执行的机会。如果没有的话,那么yield()方法将不会起作用,并且由可执行状态后马上又被执行。  
  •   yield()方法可以让当前正在执行的线程暂停,但它不会阻塞该线程,他只是将该线程转入就绪状态,完全可能出现的情况:当某个线程调用了yield方法暂停之后,线程调度器又将其调度出来重新执行。  实际上,当某个线程调用了yield方法暂停之后,只有优先级与当前线程相同、或者优先级比当前线程更高的就绪状态的线程才会获得执行的机会

 4.6:线程中断: interrupt( )

  程序在等待过程中,可以使用interrupt方法打断。

  eg:  interruptThread.interrupt();        //打断子线程

抛异常:

  • 1、打断处于等待状态的线程(对于阻塞状态的线程不起作用,如因synchronized方法或代码块等而阻塞的线程):在wait或sleep的线程、在等待线程结束的线程(join的调用者)可以被中断(叫打断更贴切),如果被中断,会抛出InterruptedException异常
  • 2、对非等待状态的线程调用interrupt不会抛异常,需要手动检测线程状态并做相应处理。

4.7:线程的生命周期

1)系统描述:对于线程,当线程被创建,进入新生状态;调用start()方法 ,进入就绪状态(可执行状态);如果抢到cpu,进入运行状态;运行过程中出现了阻塞,进入阻塞状态;程序结束,进入死亡状态

2)线程的五种状态:

  • New(新生):线程被实例化,但是还没有开始执行
  • Runnable(就绪):调用start()方法,等待CPU时间片;
  • Running(运行):抢到了时间片,CPU开始处理这个线程中的任务;
  • Blocked(阻塞):    线程在执行过程中遇到特殊情况,使得其他线程就可以获得执行的机会,被阻塞的线程会等待合适的时机重新进入就绪状态;
  • Dead(死亡):线程终止;

3)线程的2种死亡方式:

  1.       run方法执行完成,线程正常结束——正常的死亡;
  2.       直接调用该线程的stop方法,强制终止这个线程;

 五)后台线程:

线程分为前台(用户)线程和后台(守护)线程。

后台线程:隐藏起来一直在默默运行的线程,直到进程结束,又被称为守护线程。举例:JVM的垃圾回收线程就是典型的后台线程。特征:如果所有的前台线程都死亡、结束,后台线程才会死亡、结束。

前台线程:默认的线程都是前台线程,如果前台不执行完毕,程序不会退出。

 eg:  daemonThread.setDaemon(true);          // 设置为后台线程


 

 

 

 

 

 

转载地址:http://tytzi.baihongyu.com/

你可能感兴趣的文章
ANSI与UTF8之间的转换!std::string与UTF8之间的转换
查看>>
C++实现http下载 && 24点计算编码风格
查看>>
osg源码编译步骤
查看>>
自绘static控件,实现特殊效果
查看>>
#!/usr/bin/env python
查看>>
Linux中常用的操作命令以及vim操作命令和gdb调试命令
查看>>
windows以及linux 环境下Google Protocol Buffer 下载编译安装教程
查看>>
memcached了解使用和常用命令详解
查看>>
GDB调试各功能总结
查看>>
Protocol Buffer技术 语言规范
查看>>
"undefined reference to" 多种可能出现的问题解决方法
查看>>
Linux 线程操作函数技能总结
查看>>
Linux git 常用命令
查看>>
线程池原理及创建并C++实现
查看>>
Mysql命令教程大全
查看>>
文档类程序各个类之间的相互访问关系
查看>>
sql server中count(*),count(col),count(1)的区别
查看>>
多年来,STL容器的使用总结!
查看>>
switch()case:语句的优化
查看>>
C语言各种数据类型在系统中占的字节和取值范围
查看>>