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 控制线程的更多相关文章

  1. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  2. Java核心知识点学习----使用Condition控制线程通信

    一.需求 实现线程间的通信,主线程循环3次后,子线程2循环2次,子线程3循环3次,然后主线程接着循环3次,如此循环3次. 即:A->B->C---A->B->C---A-> ...

  3. Java中怎么控制线程訪问资源的数量

    在API中是这样来描写叙述Semaphore 的 Semaphore 通经常使用于限制能够訪问某些资源(物理或逻辑的)的线程数目. 一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可 ...

  4. Java之CountDownLatch ---控制线程执行顺序

    一,类介绍 这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法  countDown()方法以及await()方法.在完成一组正在其他线程中执行的操作之前,它允许 ...

  5. Java多线程学习(四)---控制线程

    控制线程 摘要: Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程的执行 1. join线程控制,让一个线程等待另一个线程完成的方法 2. 后台线程,又称为守护线程 ...

  6. Java -- 使用阻塞队列(BlockingQueue)控制线程通信

    BlockingQueeu接口是Queue的子接口,但是它的主要作用并不是作为容器,而是作为线程同步的工具. 特征: 当生产者线程试图向BlockingQueue中放入元素时,如果该队列已满,则该线程 ...

  7. JAVA学习笔记16——控制线程

    Java的线程支持提供了一些便捷的工具方法,通过这些便捷的工具方法可以很好地控制线程执行.   join线程 Thread提供了让一个线程等待另一个线程完成的方法——join().当在某个线程执行流中 ...

  8. Java:谈谈控制线程的几种办法

    目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...

  9. java之线程

    java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...

随机推荐

  1. 遗传算法的简单应用-巡回旅行商(TSP)问题的求解

    上篇我们用遗传算法求解了方程,其中用到的编码方式是二进制的编码,实现起来相对简单很多, 就连交配和变异等操作也是比较简单,但是对于TSP问题,就稍微复杂一点,需要有一定的策略, 才能较好的实现. 这次 ...

  2. 一个不错的php验证码的类

    类的代码: <?php class Captcha { private $width; private $height; private $codeNum; private $code; pri ...

  3. Model元数据提供机制小结

    在最开始先我得说说我看这部分的情况,最开始被各种ModelMetadata和各种ModelMetadataProvider给搞晕了,就几页书花了我好大的精力去看,直到后来看了一幅类图,细细看各个类之间 ...

  4. 让Windows2008R2也能进入手柄设置(游戏控制器设置)

    在Windows2008 R2系统中,插入XB360手柄后能自动完成驱动安装,在[设备和打印机]中也会出现手柄,但在上面右键→游戏控制器设置却没反应,什么都没打开,虽然不影响实际游戏,但总感觉有点堵. ...

  5. java for 的用法总结

    J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...

  6. ab网站压力测试

    ab网站压力测试命令的参数.输出结果的中文注解    permalink 以前安装好APACHE总是不知道该如何测试APACHE的性能,现在总算找到一个测试工具了.就是APACHE自带的测试工具AB( ...

  7. 疯狂Android讲义 - 学习笔记(一)

    常用开发工具的用法 android : 启动Android SDK管理器 android --help  查看具体用法 android create avd -n t10 -t 10 -b armea ...

  8. font-family常见字体

    font-family:"Times New Roman",Georgia,Serif font-family:Arial,Verdana,Sans-serif font-fami ...

  9. JavaWeb前端基础复习笔记系列 二

    课程:孔浩前端视频教程(JavaScript系列:1~5讲) <html> <head> <title></title> <!--html只负责显 ...

  10. python打印进度条

    import sys,time第一种方法: for i in range(50): sys.stdout.write("#") time.sleep(0.1) sys.stdout ...