Java多线程(二)——多线程基本特性
目录
一、引言
二、优先级
三、睡眠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多线程(二)——多线程基本特性相关推荐
- java线程 锁_Java多线程(二) 多线程的锁机制
当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...
- 黑马程序员java笔记之二-----多线程
java中实现多线程操作有两种手段,一种继承自Thread类,另一种是实现Runnable接口. 一.继承Thread Thread类是在java.lang包中定义的,一个类只要继承了Thread类, ...
- Java读书笔记(4)-多线程(二)
Java读书笔记(4)-多线程(二) 2016-1-2 线程通信 传统的线程通信 Object类提供了wait(),notify()和notifyAll三个方法 适用情况:synchronized修饰 ...
- Java基础、多线程、JVM、集合八股文自述(持续更新)
Java基础.多线程.JVM.集合八股文自述 一.Java基础 1.1 object类有哪些方法? getClass().hashCode().equals().clone().toString(). ...
- (四)Java中的多线程之间实现同步+多线程并发同步
一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...
- 【Java程序设计】多线程基础
多线程基础 文章目录 多线程基础 一.线程的概念 (1)进程 (2)线程 二.线程的创建 (1)Thread 1.Thread类 2.Thread类的子类来创建线程 3.在新线程中完成计算某个整数的阶 ...
- 【手把手带你学Java EE】多线程那些事,你了解了吗?
[手把手带你学Java EE]多线程那些事,你了解了吗? 线程 概念 意义 进程和线程的区别 面试题:谈谈进程和线程的区别和联系 Java中的多线程编程 创建线程的方法 方法一 方法二 方法三 &am ...
- java面试(多线程)
1. Callable.Future.FutureTash详解 Callable与Future是在JAVA的后续版本中引入进来的,Callable类似于Runnable接口,实现Callable接口的 ...
- Java面试题--多线程
什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. 线程和进程有什么区别? ...
- Java学习笔记---多线程并发
Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...
最新文章
- 滴滴自研分布式 NoSQL 数据库 Fusion 的演进之路
- html中autocomplete无效,OnChange和AutoComplete都不能使用HTML.TextBox
- C#中重写(override)和覆盖(new)的区别
- vmware给linux增加空间,vmware增加linux硬盘空间
- java 查看虚拟机状态_深入理解java虚拟机学习笔记(四)虚拟机性能监控与故障处理工具...
- 用css控制背景图片的位置,大小
- Windows 10 + kali Linux 双系统安装教程(详细版)
- 使用 WebSphere ESB 构建企业服务总线
- 资源下载的终极利器-资源轻松简单下载-资源万能下载法
- 怎么在计算机中搜索可移动硬盘,为什么本地硬盘在计算机上显示为可移动硬盘...
- Matlab计算轮廓内切圆
- Excel函数IF的多条件通配使用方法
- Java随机产生昵称
- SQL 获取年度第几周
- CAD转PDF如何设置其为高质量黑白形式?
- Laravel Provider用法
- 微软明年停止支持IE浏览器 鼓励使用Edge浏览器
- 解决SQL Server报错:229、262、5123
- phpBB使用教程教程详解
- win10上ipa包安装到iPhone手机上的方法