java 22 - 7 多线程之控制线程的方法
线程休眠(让线程休息一会再运行)
public static void sleep(long millis)
在自定义线程类中添加该方法。
更改后,运行测试类,结果就是每执行完一轮,就休息1秒(这里设置的是休眠1秒),再进行一轮。
一轮:(如果测试类调用了3个线程,那么就是随机运行3次为一轮)
如:
哈士奇:1,日期:Wed Oct 05 21:01:19 CST 2016
短尾猫:1,日期:Wed Oct 05 21:01:19 CST 2016
萨摩耶:1,日期:Wed Oct 05 21:01:19 CST 2016
休息1秒,继续:
萨摩耶:2,日期:Wed Oct 05 21:01:20 CST 2016
哈士奇:2,日期:Wed Oct 05 21:01:20 CST 2016
短尾猫:2,日期:Wed Oct 05 21:01:20 CST 2016
public class ThreadSleep extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x + ",日期:" + new Date());
// 睡眠
// 稍微休息1秒钟
try {
Thread.sleep(1000);//由于父类没有抛出异常,所以得try{}catch(){}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程加入
public final void join():等待该线程终止。 这个方法是在测试类上添加的
也就是说,得等这个线程运行结束,别的线程才能运行
以下代码就是,哈士奇先数完0-99,萨摩耶和短尾猫才能运行。。。二哈真6
public class ThreadJoinDemo {
public static void main(String[] args) {
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin();
tj1.setName("哈士奇");
tj2.setName("萨摩耶");
tj3.setName("短尾猫");
tj1.start();
try {
tj1.join();//由于父类没有抛异常,所以得try{}catch(){}
} catch (InterruptedException e) {
e.printStackTrace();
}
tj2.start();
tj3.start();
}
}
线程礼让
public static void yield(); :暂停当前正在执行的线程对象,并执行其他线程。
让多个线程的执行更和谐,但是不能靠它保证全部的和谐(即是哈士奇运行一次,萨摩耶运行一次,短尾猫运行一次)。
这个方法不能完全保证,有可能哈士奇连续运行几次。二哈继续6。。
该方法在测试类中添加:
public class ThreadYield extends Thread {
@Override
public void run() {
for (int x = 0; x < 100; x++) {
System.out.println(getName() + ":" + x);
Thread.yield();
}
}
}
守护线程
public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。 该方法必须在启动线程前调用。
通俗易懂地说:守护线程是用来保护别的非守护线程的,如果其它非守护线程都停止了,守护线程自身也必须停止
(保护的人挂了,守护者也得挂,不过守护者得到消息再挂,所以受保护者挂了以后,守护者会继续执行几次再挂)
代码:
//这个代码中,刘备一运行完毕,张飞关羽跟着再运行几次,就停止
public class ThreadDaemonDemo {
public static void main(String[] args) {
ThreadDaemon td1 = new ThreadDaemon();
ThreadDaemon td2 = new ThreadDaemon(); td1.setName("关羽");
td2.setName("张飞"); // 设置守护线程
td1.setDaemon(true);
td2.setDaemon(true); td1.start();
td2.start(); Thread.currentThread().setName("刘备");
for (int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
}
}
再来个配图:坦克大战

中断线程
public final void stop():让线程停止,过时了,但是还可以使用。
替代stop的:
public void interrupt():中断线程。 把线程的状态终止,并抛出一个InterruptedException。
自定义多线程类:
public class ThreadStop extends Thread {
@Override
public void run() {
System.out.println("开始执行:" + new Date());
// 休眠10秒钟
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// e.printStackTrace();
System.out.println("线程被终止了");
}
System.out.println("结束执行:" + new Date());
}
}
测试类:
public class ThreadStopDemo {
public static void main(String[] args) {
ThreadStop ts = new ThreadStop();
try {
Thread.sleep(3000);
// ts.stop(); //过了3秒后,关闭ThreadStop线程,
ts.interrupt(); //中断线程。 把线程的状态终止,并抛出一个InterruptedException
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void interrupt():的执行结果:
开始执行:Wed Oct 05 21:58:44 CST 2016
线程被终止了
结束执行:Wed Oct 05 21:58:47 CST 2016
java 22 - 7 多线程之控制线程的方法的更多相关文章
- java 22 - 12 多线程之解决线程安全问题的实现方式1
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备, ...
- java 22 - 13 多线程之解决线程安全问题的实现方式2
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ; Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 ...
- [转载]C# 多线程、控制线程数提高循环输出效率
C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...
- C# 多线程、控制线程数提高循环输出效率
C#多线程及控制线程数量,对for循环输出效率. 虽然输出不规律,但是效率明显提高. 思路: 如果要删除1000条数据,只使用for循环,则一个接着一个输出.所以,把1000条数据分成seed段,每段 ...
- 【Java 线程的深入研究1】Java 提供了三种创建线程的方法
Java 提供了三种创建线程的方法: 通过实现 Runnable 接口: 通过继承 Thread 类本身: 通过 Callable 和 Future 创建线程. 1.通过实现 Runnable 接口来 ...
- java 22 - 5 多线程之获取和设置线程对象的名称
如何获取线程对象的名称呢? public final String getName():获取线程的名称.如何设置线程对象的名称呢? public final void setName(String n ...
- Java基础教程——多线程:创建线程
多线程 进程 每一个应用程序在运行时,都会产生至少一个进程(process). 进程是操作系统进行"资源分配和调度"的独立单位. Windows系统的"任务管理器&quo ...
- 程序员:java中直接或间接创建线程的方法总结
在java开发中,经常会涉及多线程的编码,那么通过直接或间接创建线程的方法有哪些?现整理如下: 1.继承Thread类,重写run()方法 class Worker extends Thread { ...
- java 22 - 20 多线程之线程池
程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互. 而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池. 线程池里的每一个线程代码结束后 ...
随机推荐
- AE选中要素
private void 选中要素ToolStripMenuItem_Click(object sender, EventArgs e) { if(axMapControl2.LayerCount&l ...
- 一次失败的APP业务渗透测试
作者:whoamiecho 来源:ichunqiu 本文参加i春秋社区原创文章奖励计划,未经许可禁止转载! 一. 过程 1.1.事情起因:暴力破解 测试给了个普通用户账号,可以登录.APP一来就要登 ...
- 关于SharPoint2013一点细节的深究
在进行SharePoint2013的开发过程中我发现在开启了某些功能,或者说是创建了个人站点之后有很多地方变了比如下面这个地方: 当然相应的URL地址也发生改变.也许很明确的我就打开了Welc ...
- 关于Android 的内存泄露及分析
一. Android的内存机制Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似.程序员通过new为对象分配内存,所有对象在java堆内分配空间:然而对象的释 ...
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...
- jQuery倒计时
Css------------------------------------------------------------------------------------------------- ...
- UITableView传值(自己使用)(属性,代理传值)
今天有些匆忙. 效果图如下: 代码如下: #import <UIKit/UIKit.h> #import "FirstViewController.h" @interf ...
- 编译生成IOS开发使用的FFmpeg的过程
前言:本篇随笔纯属是参照<iOS 使用 FFmpeg>的过程,本人自己操作了一遍,但是本人记性不好,觉得这样的过程可以记录在博客中,以后需要可以快速回头翻阅细节.所以特地参考<iOS ...
- Windows7下安装CentOS
以CentOS为平台,配以其他软件共同组成工作平台! 第一部分:安装前准备 1. 准备两个fat32格式的分区,一个用于存放centos光盘镜像及相关安装程序,一个用于安装centos( ...
- Spring的IOC逐层深入——依赖注入的两种实现类型
构造器注入 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <?xml version="1.0" encoding="UTF-8 ...