博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程学习笔记
阅读量:2205 次
发布时间:2019-05-04

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

1.什么是多线程

 

1.1 进程概念

  

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

 

1.2 线程概念

  在一个程序中同时运行的多个独立流程,每一个独立的流程就是一个线程

 

1.3.什么是多线程

  

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程(台湾译作“执行绪”),进而提升整体处理(搜狗百科),最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。

 

 

2.线程的创建

 

 2.1 通过实现 Runnable 接口;

class Thread1 implements Runnable{    public  void  run(){        System.out.println("run.....");    }}public class XianChengTest {    public static void main(String[] args) {    Thread t1 = new Thread(new Thread1());    t1.start();    }}

 运行结果

 run.....

 

2.2 通过继承 Thread 类本身,重写run()方法 

class Thread1 extends Thread{    @Override    public  void  run(){        System.out.println("run.....");    }}public class XianChengTest {    public static void main(String[] args) {        Thread1 thread1 = new Thread1();        thread1.star();    }}

运行结果

 run.....

这里@override说明一下

@Override是Java5的元数据,自动加上去的一个标志,告诉你说下面这个方法是从父类/接口 继承过来的,需要你重写一次,这样就可以方便你阅读,也不怕会忘记

@Override是伪代码,表示重写(当然不写也可以),不过写上有如下好处: 

1>可以当注释用,方便阅读 

2>编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错 

比如你如果没写@Override而你下面的方法名又写错了,这时你的编译器是可以通过的(它以为这个方法是你的子类中自己增加的方法)

 

使用该标记是为了增强程序在编译时候的检查,如果该方法并不是一个覆盖父类的方法,在编译时编译器就会报告错误。

 

 

3.线程的状态和生命周期

3.1新建

3.2可运行

3.3正在运行

3.4阻塞

3.5终止

 

线程在一定条件下,状态会发生变化。线程一共有以下几种状态:

1、新建状态(New):新创建了一个线程对象。

2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。

3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。

4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,

(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。

(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

5、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

 

4.Thread类常用方法

4.1 sleep()方法

 public static void sleep(long  millis)

  作用:在指定毫秒数内让正在执行的线程休眠(暂停执行)

  参数为休眠时间,单位是毫秒

   Thread.sleep(times)使当前线程从Running状态放弃处理器进入Block状态,休眠times毫秒,再返回Runnable状态

import java.text.SimpleDateFormat;import java.util.Date;class ThreadDemo implements Runnable{    public  void run() {        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");        //输出系统时间的时分秒,每隔两秒显示一下,可能会出现跳秒的情况,因为阻塞1秒过后进入runnable状态,等待分配时间片进入running状态后还需要一点时间        while (true) {            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(format.format(new Date()));        }    }}public class Demo001 {    public static void main(String[] args) {        Thread t = new Thread(new ThreadDemo());        t.start();    }}//SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类。//format()方法将给定的 Date 格式化为日期/时间字符串,并将结果添加到给定的 StringBuffer

运行结果

 

 

4.2 join()方法

 public final void join()

  等待调用该方法的线程结束后才能执行

 public final void join(long millis)

  作用:等待该线程终止的时间最长时间为millis毫秒。(Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。join的意思是使得放弃当前线程的执行,并返回对应的线程。)

  如果millis为0则意味着要一直等下去。

 

 

5.线程优先级

优先级被划分为1-10,1最低10最高,超出范围会抛出异常,主线程默认是5。优先级越高的线程被分配时间片的机会越多,那么被CPU执行的机会就越多。

void setPriority(int p),设置当前线程的优先级, 最高,最低,默认都有常量对应。
设置了优先级也不能100%控制线程调度。只是最大程度的告知线程调度以更多的几率分配时间片给线程优先级高的线程

   

 

转载于:https://www.cnblogs.com/songhuiqiang/p/10838367.html

你可能感兴趣的文章
Sublime text3快捷键演示
查看>>
sublime text3 快捷键修改
查看>>
关于PHP几点建议
查看>>
硬盘的接口、协议
查看>>
VLAN与子网划分区别
查看>>
Cisco Packet Tracer教程
查看>>
02. 交换机的基本配置和管理
查看>>
03. 交换机的Telnet远程登陆配置
查看>>
微信小程序-调用-腾讯视频-解决方案
查看>>
phpStudy安装yaf扩展
查看>>
密码 加密 加盐 常用操作记录
查看>>
TP 分页后,调用指定页。
查看>>
Oracle数据库中的(+)连接
查看>>
java-oracle中几十个实用的PL/SQL
查看>>
PLSQL常用方法汇总
查看>>
几个基本的 Sql Plus 命令 和 例子
查看>>
PLSQL单行函数和组函数详解
查看>>
Oracle PL/SQL语言初级教程之异常处理
查看>>
Oracle PL/SQL语言初级教程之游标
查看>>
Oracle PL/SQL语言初级教程之操作和控制语言
查看>>