Java多线程程序休眠、暂停与停止
休眠
在Java多线程中,可以使用sleep()方法在指定毫秒数内让当前正在执行的线程休眠。
下面这段代码,使得主函数的main线程休眠了2000ms,最后输出的间隔时间也是2000ms。
public class MyThread extends Thread {
public static void main(String[] args) {
try {
long begin;
long end;
begin = System.currentTimeMillis();
System.out.println("begin = " + begin);
Thread.sleep(2000);
end = System.currentTimeMillis();
System.out.println("end = " + end);
System.out.println("end - begin = " + (end - begin) + "ms");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果:
begin = 1486711105366
end = 1486711107366
end - begin = 2000ms
暂停
虽然suspend和resume方法可以分别使得线程暂停和回复,但是这两个方法因为有缺点而已经被弃用。
缺点:
- 独占:在使用suspend和resume方法时,如果使用不当,极易造成公共的同步对象独占,使得其他线程无法访问公共同步对象。
- 不同步:在使用suspend与resume方法时也容易因为线程而导致数据不同步的情况。
yield方法
可以使用yield方法进行暂停。
yield()方法的作用是放弃当前的CPU资源,将它让给其他任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片。
public class MyThread extends Thread {
@Override
public void run() {
long beginTime = System.currentTimeMillis();
int count = 0;
for (int i = 0; i < 50000000; i++) {
//Thread.yield();
count = count + (i + 1);
}
long endTime = System.currentTimeMillis();
System.out.println("用时: " + (endTime - beginTime) + "ms");
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
输出结果:
用时: 21ms
去掉注释//Thread.yield()后。
输出结果:
用时: 4471ms
从第二次输出可以看出,用时明显变长。
停止
虽然stop()可以停止一个线程,但是这个方法是不安全的,而且是已经被弃用作废的,最好不要使用它。
interrupt()方法
interrupt()方法的使用效果并不像for+break语句那个,马上就停止循环。调用interrupt()方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程。
判断线程是否是停止状态
- this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志清楚为false的功能,为static方法。
- this.isInterrupted():测试线程Thread对象是否已经是中断状态,但是不清除状态标志。
public class MyThread extends Thread {
public static void main(String[] args) {
Thread.currentThread().interrupt();
System.out.println("是否停止1? " + Thread.interrupted());
System.out.println("是否停止2? " + Thread.interrupted());
System.out.println("end");
}
}
输出结果:
是否停止1? true
是否停止2? false
end
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 50000; i++) {
System.out.println(i);
}
}
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
System.out.println("是否停止1? " + myThread.isInterrupted());
System.out.println("是否停止2? " + myThread.isInterrupted());
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果(末尾):
49997
49998
49999
是否停止1? false
是否停止2? false
end
能停止线程的方法
在run中加一个判断,如果停止了,则break跳出循环体。
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 50000000; i++) {
if (this.interrupted()) {
System.out.println("已经是停止状态了,我要退出了");
break;
}
System.out.println(i);
}
}
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果(末尾):
160560
160561
160562
160563
160564
end
已经是停止状态了,我要退出了
上述代码虽然可以停止线程,但是如果for的后面还有语句,那么还是会继续执行。
因此可以用下述方法来解决。
public class MyThread extends Thread {
@Override
public void run() {
try {
for (int i = 0; i < 50000000; i++) {
if (this.interrupted()) {
System.out.println("已经是停止状态了,我要退出了");
throw new InterruptedException();
}
System.out.println(i);
}
System.out.println("for结束");
} catch (InterruptedException e) {
System.out.println("进入run中的catch了");
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
MyThread myThread = new MyThread();
myThread.start();
Thread.sleep(1000);
myThread.interrupt();
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
输出结果(末尾):
152891
152892
152893
152894
end
已经是停止状态了,我要退出了
进入run中的catch了
java.lang.InterruptedException
at mythread.MyThread.run(MyThread.java:13)
Java多线程程序休眠、暂停与停止的更多相关文章
- JAVA多线程程序ProgressBar2
JAVA多线程程序ProgressBar2 题目简介: 思路分析:与上一篇:JAVA多线程程序ProgressBar类似,本篇避免过于冗杂,所以在此没有给出. 实验代码: import java.aw ...
- JAVA多线程程序ProgressBar
JAVA多线程程序ProgressBar 题目简介: 思维导图: 实验代码:建议先看CalThread类,计算线程的实现,再作基本CalFrame类的界面, 然后作ReadThread类,结合CalF ...
- Java多线程-程序运行堆栈分析
class文件内容 class文件包含JAVA程序执行的字节码:数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符:文件开头有一个0xcafebabe(16进制)特殊的一个标志. ...
- java 多线程7(线程的停止)
notify(): 是很温和的唤醒线程的方法,它不可以指定清除哪一个异常 interrupt(): 粗暴的方式,强制清除线程的等待状态,被清除的线程会接收到一个InterruptedException ...
- 简述Java多线程(一)
JAVA多线程 程序:是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念. 进程:是执行程序的一次执行过程,是一个动态的概念,是系统资源分配的单位. 线程是CPU调度和执行的单位. 创 ...
- Java多线程(上)
Java多线程 程序.进程和线程 一.程序 程序是存储在磁盘上, 包含可执行机器指令和数据的静态实体. 即进程或者任务是处于活动状态的计算机程序. 二.进程 进程是资源(CPU.内存等)分配的基本单位 ...
- java多线程系列六、线程池
一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池. 2. 使用线程池的好处 a) 降低资源的消耗.使用线程池不用频繁的创建线程和销毁线程 b) 提高响应速度,任 ...
- 【Java多线程】Executor框架的详解
在Java中,使用线程来异步执行任务.Java线程的创建与销毁需要一定的开销,如果我们为每一个任务创建一个新线程来执行,这些线程的创建与销毁将消耗大量的计算资源.同时,为每一个任务创建一个新线程来执行 ...
- java多线程(五)之总结(转)
引 如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个 ...
随机推荐
- HDU 5631 Rikka with Graph
如果原图不连通,直接输出0. 如果原图连通,删除X条边之后要保证新图连通,再看数据是n+1条边-->因此,最多只能删去两条边. 因为n=100,可以枚举进行验证,枚举删去每一条边是否连通,枚举删 ...
- object - c 在URL中截取特定参数的值
#pragma mark - 获取url特定的参数 -(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress { NSE ...
- iOS开发之监听键盘高度的变化
最近做的项目中,有一个类似微博中的评论转发功能,屏幕底端有一个输入框用textView来做,当textView成为第一响应者的时候它的Y值随着键盘高度的改变而改变,保证textView紧贴着键盘,但又 ...
- iOS技术框架构和更新版本的技术特性
Core OS层 Sytem 系统层包括内核环境,驱动及操作系统层unix接口.内核以mach为基础,它 负责操作系统的各个方面,包括管理系统的虚拟内存,线程,文件系统,网络以及进程间通讯.这一层包含 ...
- The account '...' is no team with ID '...'
iOS升到9.2之后,有一个大坑,原先真机调试的开发者账号(未付费),连不了Xcode了,会弹出一个提示框提示你, The account '...' is no team with ID '...' ...
- 制作毛玻璃效果 分类: ios技术 2015-07-14 09:03 240人阅读 评论(0) 收藏
//添加一个图片 UIImageView *imageview = [[UIImageView alloc]init]; imageview.frame = CGRectMake(10 ...
- struts2拦截器-自定义拦截器,放行某些方法(web.xml配置)
一.web.xml配置 <filter> <filter-name>encodingFilter</filter-name> <filter-class> ...
- 在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
在IOS中使用DES算法对Sqlite 数据库进行内容加密存储并读取解密 涉及知识点: 1.DES加密算法: 2.OC对Sqlite数据库的读写: 3.IOS APP文件存储的两种方式及读取方式. 以 ...
- Poi2006 Palindromes
2780: Poi2006 Palindromes Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 15 Solved: 5[Submit][Stat ...
- System.Web.UI.WebControls的Web服务器控件
calendar[英][ˈkælɪndə(r)][美][ˈkæləndɚ]n.日历; 历法; 日程表; (一年之中的)重大事件(或重要日期)一览表; vt.把…记入日程表中; 把…列入表中; 为(文件 ...