Java 控制线程
1、join
public class JoinThreadTest extends Thread {
public JoinThreadTest(String name){
super(name);
}
@Override
public void run() {
for(int i = 0; i < 100; i++){
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
for(int i = 0; i < 1000; i++){
if (i== 20) {
JoinThreadTest joinThreadTest = new JoinThreadTest("JoinThread");
joinThreadTest.start();
try {
joinThreadTest.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
当调用join方法后,主线程将进入阻塞状态,直到被join()方法加入的join线程执行完成为止。通常用来将大问题化为小问题,每个小问题分配一个线程,当这些小问题线程执行完成后,再调用主线程做进一步的处理。
2、后台线程Daemon
主线程默认是前台线程,由前台线程创建的线程默认是前台线程,由后台线程创建的线程默认为后台线程。当所有的前台线程都死亡后,后台线程会自动死亡。设置线程为后台线程,调用setDaemon(true)必须在start()之前调用,判断一个线程是否为后台线程可用isDaemon()判断。
public class DaemonThreadTest extends Thread{
public DaemonThreadTest(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
DaemonThreadTest daemonThreadTest = new DaemonThreadTest("DaemonThread");
daemonThreadTest.setDaemon(true);
daemonThreadTest.start();
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
运行如上代码后可知,DaemonThread不会输出到999,而是当主线成执行完后,过了一段时间后,DaemonThread也就结束了。
3、sleep 和 yield
sleep调用后使线程进入阻塞状态,在该线程的睡眠时间内,即使cpu空闲,线程也不会获得执行机会。睡眠结束后,线程进入就绪状态,等待调度进入运行状态。对所有优先级的线程有效。
yield 只是简单让当前线程暂停一下,使线程调度器重新调度,只对优先级大于等于当前线程的线程有效。当前线程也有可能在暂停一下后,立即调度再次进入运行态。
另外调用sleep会抛出InterruptException,而yield不会。
public class YieldTest extends Thread {
public YieldTest(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
if (i== 20) {
Thread.yield();
}
}
}
public static void main(String[] args) {
YieldTest yieldTest1 = new YieldTest("High");
yieldTest1.setPriority(MAX_PRIORITY);
yieldTest1.start();
YieldTest yieldTest2 = new YieldTest("Low");
yieldTest2.setPriority(MIN_PRIORITY);
yieldTest2.start();
}
}
由于如上代码设置了不同优先级,执行如上代码,当执行到i==20时,High线程虽然让出资源,但是优先级高,重新调度后,还是High线程继续执行,注释掉设置优先级的两行代码后执行,可发现在i==20后,线程调度,High线程会出让资源给Low运行。
4、改变线程的优先级
线程优先级设置如上例,子线程的优先级默认与父线程的优先级一致。
Java 控制线程的更多相关文章
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- Java核心知识点学习----使用Condition控制线程通信
一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...
- Java中怎么控制线程訪问资源的数量
在API中是这样来描写叙述Semaphore 的 Semaphore 通经常使用于限制能够訪问某些资源(物理或逻辑的)的线程数目. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可 ...
- Java之CountDownLatch ---控制线程执行顺序
一,类介绍 这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法 countDown()方法以及await()方法.在完成一组正在其他线程中执行的操作之前,它允许 ...
- Java多线程学习(四)---控制线程
控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...
- Java -- 使用阻塞队列(BlockingQueue)控制线程通信
BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具. 特征: 当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程 ...
- JAVA学习笔记16——控制线程
Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程执行. join线程 Thread提供了让一个线程等待另一个线程完成的方法——join().当在某个线程执行流中 ...
- Java:谈谈控制线程的几种办法
目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...
- java之线程
java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
随机推荐
- 用原生JS读写CSS样式的方法总结
为了日后方便查询,本人翻阅了一些资料总结了以下方法,仅限原生JS,如有不对的地方欢迎指出!只求大家看完觉得有学到点什么就OK了! 一.可以通过DOM节点对象的style对象(即CSSStyleDe ...
- LINUX总结
LINUX总结 crazyacking 2016-02-26 主要对socket编程,多线程,定时器,条件变量总结 多线程篇 概念: 多线程就是允许一个进程内存存在多个控制权,实现多个线程并发执行. ...
- ASP.NET MVC系列:为视图添加查询功能
首先,在MoviesController里添加一个查询方法,代码如下 public ActionResult SearchIndex(string title) { //查询数据库中的电影表 var ...
- 自己写的一个简单的jQuery提示插件
代码: /** * 2014年11月13日 * 提示插件 */ (function ($) { $.fn.tips = function (text) { var divtipsstyle = &qu ...
- 基于Winform的.cs文件命名空间排序及注释批量处理工具
公司里每个程序员在命名空间的排序和注释上都有很多的不同. 杂乱的命名空间: using System; using System.Collections.Generic; using Autodesk ...
- windows自定义命令的创建
首先在任意位置创建一个文件夹,我使用的目录是D:\Program Files\Quick Start\command\,桌面我的电脑/计算机图标右键属性 高级系统设置 -> 高级 -> 环 ...
- 为什么很多APP要有启动页面
我们启动APP时,一般都会是一张含有LOGO的图片.这张图片叫做启动页面. 这个启动页面是必须.一定需要的吗?有什么作用? 这是苹果官方对于iOS启动页的设计说明: 为了增强应用程序启动时的用 ...
- 暴风冯鑫:去美国香港的99%都亏,互联网公司打死都要回A股
“上市之后,我回答得最多的两句话:一句是运气好:另一句是有好运气要好好地使用它.” 5月18日,暴风科技上市55天后,首享科技大厦办公室里,暴风科技CEO冯鑫这样对我说. 在经历了36个涨停之 ...
- ScrollView与ListView冲突解决
正 常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把 ListView的layout_height改成400dip ...
- 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native
[源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...