文档章节

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

Credo-Zhao
 Credo-Zhao
发布于 2013/02/06 16:12
字数 1182
阅读 403
收藏 8

精选30+云产品,助力企业轻松上云!>>>

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个常量来使用最好.



Credo-Zhao

Credo-Zhao

粉丝 311
博文 172
码字总数 247461
作品 0
朝阳
技术主管
私信 提问
加载中
请先登录后再评论。
【多线程】多线程基础

一、导图总结 二、线程的创建和启动 1、继承Thread类创建线程类 2、实现Runable 接口创建线程类 3、使用Callable和Future创建线程 三、线程的生命周期 四、线程控制 1、线程插队/join线程 2、...

杨倩-Yvonne
03/31
0
0
java 多线程 3 : 控制线程

join线程:     public class JoinThread extends Thread{ } }   程序中有三个线程,Thread-0开始和main线程并发执行,当主程序i==20时,启动了名为Join-Thread线程,Join-Thread线程...

osc_2v8es9o5
2018/09/18
2
0
Java多线程--基础

原文链接: http://www.imrookie.cn/article/java-thread-base Java使用Thread类代表线程,所有的线程都必须是Thread或其子类的实例。 执行代码写在run()方法中。 使用start()方法启动线程...

osc_apej9ed1
2018/06/10
2
0
【Java基础】多线程(详细内容总结)

文章目录 一、线程 二、多线程 一、线程 线程 vs 进程 1、联系 线程 – 进程 线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程 线程可以拥有自己的堆栈、程序设计...

写一封信
04/01
0
0
线程状态的转换

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

翊骷
2014/05/22
99
0

没有更多内容

加载失败,请刷新页面

加载更多

使当前提交成为Git存储库中唯一的(初始)提交? - Make the current commit the only (initial) commit in a Git repository?

问题: I currently have a local Git repository, which I push to a Github repository. 我目前有一个本地Git存储库,我将其推送到Github存储库。 The local repository has ~10 commits, ......

javail
34分钟前
14
0
IntelliJ IDEA 默认快捷键大全

Remember these Shortcuts 常用 功能 快捷键 备注 ● Smart code completion Ctrl + Shift + Space - ● Search everywhere Double Shift - ● Show intention actions and quick-fixes Alt......

巨輪
今天
18
0
Hacker News 简讯 2020-07-14

更新时间: 2020-07-14 02:01 Chipmaker Analog Devices to Acquire Maxim Integrated for $21B - (reuters.com) 芯片制造商模拟设备公司将以210亿美元收购Maxim Integrated 得分:92 | 评论:......

FalconChen
今天
129
0
绕过移动端系统限制的 dlopen 库 byOpen

byOpen是一个绕过移动端系统限制的增强版dlfunctions库。 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持)。 Android 7以上dlopen, System.load都是...

shzwork
昨天
31
0
Golang学习系列第二天:变量、常量、数据类型和流程语句

继golang第一天后,今天学习下golang的变量、常量、数据类型和控制流语句。 做过其他编程语言(比如JavaScript,java,python)项目的话,其实很好理解变量、常量、数据类型和控制流。 变量也...

董广明
昨天
48
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部