目录

一、引言

二、优先级

三、睡眠sleep

四、加入线程join

五、礼让线程yield

六、守护线程daemon

七、中断线程

八、总结


一、引言

在jdk1.5之前多线程有很多基础的功能,下面主要介绍一下最基本的特性,知道会使用就行。

二、优先级

每一个 Java 线程都有一个优先级,这样有助于操作系统确定线程的调度顺序。

Java 线程的优先级是一个整数,其取值范围是 1 (Thread.MIN_PRIORITY ) - 10 (Thread.MAX_PRIORITY )。默认情况下,每一个线程都会分配一个优先级 NORM_PRIORITY(5)。

优先级只是说概率上会大一些,属于模糊执行。

public class Testpriority {public  static  void main(String [] args){Runnable runnable=new Runnable() {public void run() {while(true){System.out.println("线程——"+ Thread.currentThread().getName());}}};Thread thread1= new Thread(runnable);Thread thread2= new Thread(runnable);//priority1——10,默认为5thread1.setPriority(10);thread2.setPriority(1);thread1.start();thread2.start();}
}

三、睡眠sleep

Thread.sleep(),会使当前线程进行睡眠,转让cpu执行权到其他线程,可以设置睡眠时间。属于确定执行

public class TestSleep {public  static  void main(String [] args){Runnable runnable=new Runnable() {public void run() {while(true){try {Thread.sleep(1000);//该线程休息1秒钟} catch (InterruptedException e) {e.printStackTrace();}System.out.println("线程——"+ Thread.currentThread().getName());}}};new Thread(runnable).start();}
}

四、加入线程join

在一个线程中调用other.join(),将等待other执行完后才继续本线程。属于确定执行  

  

public class Testjoin {public  static  void main(String [] args){System.out.println(Thread.currentThread().getName()+"主线程启动");final Thread thread1= new Thread(new Runnable() {public void run() {for (int i=0;i<1000;i++){System.out.println("线程——"+ Thread.currentThread().getName());}}});thread1.start();Thread thread2= new Thread(new Runnable() {public void run() {try {System.out.println("线程——"+ Thread.currentThread().getName()+"启动");thread1.join();} catch (InterruptedException e) {e.printStackTrace();}for (int i=0;i<1000;i++){System.out.println("线程——"+ Thread.currentThread().getName());}System.out.println("线程——"+ Thread.currentThread().getName()+"结束");}});thread2.start();
/*        try {thread1.join();//加入主线程} catch (InterruptedException e) {e.printStackTrace();}*/System.out.println(Thread.currentThread().getName()+"主线程结束");}
}

thread2要在 thread1.执行完毕后在thread1.join()处继续执行。

五、礼让线程yield

暂停当前正在执行的线程对象,并执行其他线程。

 yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。属于模糊执行

public class TestYeild {public  static  void main(String [] args){new Thread(new Runnable() {public void run() {System.out.println("线程——"+ Thread.currentThread().getName()+"开始");for (int i=0;i<100;i++){System.out.println("线程——"+ Thread.currentThread().getName()+"礼让");Thread.yield();//一定程度上让其他线程占用cpu高一些System.out.println("线程——"+ Thread.currentThread().getName()+"——"+i);}System.out.println("线程——"+ Thread.currentThread().getName()+"结束");}}).start();new Thread(new Runnable() {public void run() {System.out.println("线程——"+ Thread.currentThread().getName()+"开始");for (int i=0;i<100;i++){Thread.yield();System.out.println("线程——"+ Thread.currentThread().getName()+"——"+i);}System.out.println("线程——"+ Thread.currentThread().getName()+"结束");}}).start();}
}

只是尽量让thread1和thread2交替执行。

六、守护线程daemon

指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束。属于确定执行

public class Testdaemon {public  static  void main(String [] args) {Thread thread=new Thread(new Runnable() {public void run() {while (true){System.out.println(Thread.currentThread().getName()+"running");}}});System.out.println(Thread.currentThread().getName()+"开始");//thread.setDaemon(true);thread.start();System.out.println(Thread.currentThread().getName()+"结束");}
}

七、中断线程

interrupt中断线程进入死亡状态。属于确定执行

public class Testinterrupt {public  static  void main(String [] args) {Thread thread= new Thread(new Runnable() {public void run() {System.out.println(Thread.currentThread().getName()+"start");try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println("线程中止");//线程终止后报异常}System.out.println(Thread.currentThread().getName()+"end");}});System.out.println(Thread.currentThread().getName()+"start");thread.start();try {Thread.sleep(500);thread.interrupt();//中止线程报异常,如果使用stop(),子线程与后面的代码不会执行} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"end");}
}

这里直接抛出异常子线程可以继续执行,使用stop就不能接到异常。

八、总结

  • priority;
  • sleep;
  • join;
  • yield;
  • daemon;
  • interrupt;

Java多线程(二)——多线程基本特性相关推荐

  1. java线程 锁_Java多线程(二) 多线程的锁机制

    当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...

  2. 黑马程序员java笔记之二-----多线程

    java中实现多线程操作有两种手段,一种继承自Thread类,另一种是实现Runnable接口. 一.继承Thread Thread类是在java.lang包中定义的,一个类只要继承了Thread类, ...

  3. Java读书笔记(4)-多线程(二)

    Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...

  4. Java基础、多线程、JVM、集合八股文自述(持续更新)

    Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...

  5. (四)Java中的多线程之间实现同步+多线程并发同步

    一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...

  6. 【Java程序设计】多线程基础

    多线程基础 文章目录 多线程基础 一.线程的概念 (1)进程 (2)线程 二.线程的创建 (1)Thread 1.Thread类 2.Thread类的子类来创建线程 3.在新线程中完成计算某个整数的阶 ...

  7. 【手把手带你学Java EE】多线程那些事,你了解了吗?

    [手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...

  8. java面试(多线程)

    1. Callable.Future.FutureTash详解 Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接口的 ...

  9. Java面试题--多线程

     什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. 线程和进程有什么区别? ...

  10. Java学习笔记---多线程并发

    Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...

最新文章

  1. 滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路
  2. html中autocomplete无效,OnChange和AutoComplete都不能使用HTML.TextBox
  3. C#中重写(override)和覆盖(new)的区别
  4. vmware给linux增加空间,vmware增加linux硬盘空间
  5. java 查看虚拟机状态_深入理解java虚拟机学习笔记(四)虚拟机性能监控与故障处理工具...
  6. 用css控制背景图片的位置,大小
  7. Windows 10 + kali Linux 双系统安装教程(详细版)
  8. 使用 WebSphere ESB 构建企业服务总线
  9. 资源下载的终极利器-资源轻松简单下载-资源万能下载法
  10. 怎么在计算机中搜索可移动硬盘,为什么本地硬盘在计算机上显示为可移动硬盘...
  11. Matlab计算轮廓内切圆
  12. Excel函数IF的多条件通配使用方法
  13. Java随机产生昵称
  14. SQL 获取年度第几周
  15. CAD转PDF如何设置其为高质量黑白形式?
  16. Laravel Provider用法
  17. 微软明年停止支持IE浏览器 鼓励使用Edge浏览器
  18. 解决SQL Server报错:229、262、5123
  19. phpBB使用教程教程详解
  20. win10上ipa包安装到iPhone手机上的方法

热门文章

  1. MTK:GPIO模式与设置
  2. 一个中文字符占几个字节_字节与字符的关系
  3. 什么是事件的三要素?
  4. ❤️Mybatis编程界的能手—使用注解开发(建议收藏)
  5. 权重的叠加(HTML、CSS)
  6. 移动端h5 隐藏滑动滚动条
  7. spring-mvc默认首页配置
  8. linux进行硬盘分区挂载-了解系统,最更好的开发
  9. DAY8-Nessus漏洞扫描
  10. Oracle 写存储过程的一个模板还有一些基本的知识点