文档章节

并发编程基础三--join线程,后台线程,线程睡眠,线程让步,改变线程优先级

Zhao-Qian
 Zhao-Qian
发布于 2013/02/06 16:12
字数 1182
阅读 361
收藏 8
点赞 0
评论 0

Java的线程支持提供了很多便捷方法,如标题.

1.join线程

join线程的意思就是在当前这个线程A里,加入另一个线程B,此时A阻塞,进入就绪状态,等B完成(结束,线程死亡),A才会继续执行.

这个方法通常由使用线程的程序调用,用以将大问题划分成许多小问题,每个小问题配一个线程,但所有小问题处理后,再调用主线程进一步操作.

package org.credo.thread;

public class Thread_join extends Thread{

	public static void main(String[] args) throws InterruptedException {
		new Thread_join("new Thread").start();
		for(int i=0;i<100;i++){
			if(i==20){
				Thread_join thread=new Thread_join("by join's Thread.");
				thread.start();
				//main线程调用了jt线程的join方法,main线程必须等jt执行完才能继续执行.
				thread.join();
			}
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
	}
	
	//提供一个有参的构造函数,用于设置线程的名字
	public Thread_join(String name){
		super(name);
	}
	
	public void run(){
		for(int i=0;i<100;i++){
			System.out.println(getName()+" "+i);
		}
	}
}
上面是一个示例方法,是main线程调用了jt的join方法.例子可以直接运行.RUN方法里不要用这种,会死锁.

join有3种重载形式:

  • 1.join():等待被join的线程执行完成.
  • 2.join(毫秒):等到多少毫秒后不再等待.如果时间内照旧,超过不等.
  • 3.join(long 毫秒,int 毫微秒):同上.

2.后台线程

在Java中有一种线程,是在后台运行,任务是为其他线程提供服务,这种线程被称为"后台线程",Daemon Thread,也被叫做"守护线程"或"精灵线程".JVM的垃圾回收线程就是典型的后台线程.他们有个显著的特点就是,如果所有的前台线程都死亡,那么后台线程会自动死亡.

调用Thread对象的setDaemon(true)方法可将指定线程设置成后台线程.下面提供一个DEMO.

package org.credo.thread;

public class Thread_Daemon extends Thread{

	public static void main(String[] args) {
		Thread_Daemon daemonThread=new Thread_Daemon();
		daemonThread.setDaemon(true);
		daemonThread.start();
		//注意上面的,setDaemon(true)必须在start之前,否则报错.threadStateException.
		for(int i=0;i<10;i++){
			System.out.println(Thread.currentThread().getName()+" "+i);
		}
	}
	
	public void run(){
		for(int i=0;i<10000;i++){
			System.out.println(getName()+" "+i);
		}
	}
	//可以发现run方法并不会循环1W次,因此,守护线程在前台线程全挂了之后也跟着挂了.
}

3.线程睡眠 sleep

路过.........我是打酱油的......javaer都知道吧.......但值得注意的是这是让线程进入阻塞状态,而不是就绪状态.

4.线程让步 yield

它和sleep不同,它让线程进入的是就绪状态,它和sleep一样,是Thread的静态方法.

yield()只是让当前的线程暂停一下,让系统的线程调度器重新调度一次,完全可能存在的情况就是:当某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行.

实际上,当某个线程调用了yield()方法暂停后,只有优先级与当前线程相同,或者高的线程才会有机会执行.如下code:

package org.credo.thread;

public class Thread_yield extends Thread{

	public static void main(String[] args) {
		//启动2个并发线程
		Thread_yield ty1=new Thread_yield("Super A--");
		Thread_yield ty2=new Thread_yield("Super B--");
		ty1.start();
		ty2.start();
	}
	
	public Thread_yield(String name){
		super(name);
	}
	
	public void run(){
		for(int i=0;i<50;i++){
			System.out.println(getName()+" "+i);
			if(i==20){
				Thread.yield();
				System.out.println("====================");
			}
		}
	}
}
sleep和yield区别:
  1. sleep暂停当前线程后,会给其他线程执行机会,不理会优先级.而yield只会给高级,平级.
  2. sleep是将线程转入阻塞状态,而yield是就绪状态.完全可能说是调用yield后,线程管理调度器再把它扔出去执行.
  3. sleep申明抛出了InterruptedException(中断异常),而yield木有申明异常.
  4. 建议使用sleep来控制并发线程的执行.Over.

5.改变线程优先级

优先级,高的有多的执行机会.每个线程的默认优先级都和创建它的父线程优先级相同.默认情况main线程具有普通优先级.

直接贴代码了,不想写字了.

package org.credo.thread;

public class PriorityTest extends Thread{

	//默认为6.min为1,中间那个NORM_PRIORITY为5,max为6
	public static void main(String[] args) {
		Thread.currentThread().setPriority(6);
		for(int i=0;i<30;i++){
			if(i==10){
				PriorityTest low=new PriorityTest("low");
				low.start();
				System.out.println("创建之初的优先级:"+low.getPriority());
				low.setPriority(MIN_PRIORITY);
			}
			if(i==20){
				PriorityTest high=new PriorityTest("high");
				high.start();
				System.out.println("创建之初的优先级:"+high.getPriority());
				high.setPriority(MAX_PRIORITY);
			}
		}
	}
	
	public PriorityTest(String name){
		super(name);
	}
	
	public void run(){
		for(int i=0;i<50;i++){
			System.out.println(getName()+",优先级是:"+getPriority()+",循环变量的值为:"+i);
		}
	}
}
一般情况下使用java指定的3个常量来使用最好.



© 著作权归作者所有

共有 人打赏支持
Zhao-Qian
粉丝 309
博文 157
码字总数 237336
作品 0
朝阳
高级程序员
Java线程:线程状态的转换

一、线程状态 线程的状态转换是线程控制的基础。线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。用一个图来描述如下: 1、新状态:线程对象已经创建,还没有在其上调用...

beibugulf
2016/11/18
5
0
JAVA多线程--线程状态的转换

一、线程状态 线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。 1、新状态:线程对象已经创建,还没有在其上调用start()方法。 2、可运行状态:当线程有资格运行,但调...

董家二少
2016/01/13
92
0
Java Thread 多线程理论 目录索引

线程的概述 线程和进程 进程的独立性、动态性、并发性 进程的特征 并发和并行 多线程的优势 创建、启动线程 线程的实现方式 继承Thread和实现Runnable接口创建线程的区别 2种方式优缺点 线程...

ibm_hoojo
2011/05/05
0
0
Java多线程(全)学习笔记(上)

一.线程的创建和启动 java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每条线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序流的代码)。Java使...

明舞
2014/07/27
0
0
Java 多线程编程总结

一、认识多任务、多进程、单线程、多线程 要认识多线程就要从操作系统的原理说起。 以前古老的DOS操作系统(V 6.22)是单任务的,还没有线程的概念,系统在每次只能做一件事情。比如你在cop...

鉴客
2010/12/16
1K
3
java线程与并发编程实践(一)

一、给出线程的定义 线程就是一条在程序代码中独立执行的路径 二、给出runnable的定义 一个runnable就是一段封装在对象中的代码序列,它的类实现了runnable接口 三、Thread类和runnable接口完...

J星星点灯
01/10
0
0
[转载] Java多线程编程总结

今天偶然看到一篇关于Java多线程的精品文章,实在是“爱不释手”,遂转载下来,以供大家参考: [Java多线程编程总结](转自:http://lavasoft.blog.51cto.com/62575/27069) 一、认识多任务、...

晨曦之光
2012/03/09
0
0
java线程状态转换/同步与锁

Java线程的转换: 线程状态总的可分为五大状态:分别是生、死、可运行、运行、等待/阻塞。 1、 新状态:线程对象已经创建,还没有调用start()方法 2、 可运行状态:当线程有资格运行,但调度...

晨曦之光
2012/05/16
248
0
并发编程(一):多线程基础知识

两种创建线程方法 继承类: 1. 继承Thread 类; 实现接口: 2. 实现Rnnable接口; 3. 实现Callable接口(rnnable的增强版,可以有返回值和抛异常) 对比: Rnnable、Callable接口: 编程复杂...

mengdonghui123456
2017/08/15
0
0
Java小白进阶笔记(7)-多线程

Java的多线程基础学完了! 还是看的偏头痛杨大哥的博客: 10.偏头痛杨的Java入门教学系列之初级多线程篇 记一下学习笔记,最后是偏头痛杨留下的作业,我的一种解答。 线程与进程 线程与进程是...

kissjz
05/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Python -re模块及正则表达式解析

传送门: https://blog.csdn.net/pipisorry/article/details/25909899 ps:上面文章中"命名分组"的语法格式不能执行。正确的如下: (?P<name>正则表达式) #name是一个合法的标识符 除了使用别名...

一口今心
10分钟前
0
0
mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
18分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
18分钟前
8
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
28分钟前
1
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
30分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
33分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
36分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
39分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
44分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
47分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部