详解java线程的开始、暂停、继续
时间:2021-07-09 08:26:44|栏目:JAVA代码|点击: 次
Android项目中的一个需求:通过线程读取文件内容,并且可以控制线程的开始、暂停、继续,来控制读文件。在此记录下。
直接在主线程中,通过wait、notify、notifyAll去控制读文件的线程(子线程),报错:java.lang.IllegalMonitorStateException。
需要注意的几个问题:
- 任何一个时刻,对象的控制权(monitor)只能被一个线程拥有。
- 无论是执行对象的wait、notify还是notifyAll方法,必须保证当前运行的线程取得了该对象的控制权(monitor)。
- 如果在没有控制权的线程里执行对象的以上三种方法,就会报错java.lang.IllegalMonitorStateException。
- JVM基于多线程,默认情况下不能保证运行时线程的时序性。
线程取得控制权的3种方法:
- 执行对象的某个同步实例方法。
- 执行对象对应类的同步静态方法。
- 执行对该对象加同步锁的同步块。
这里将开始、暂停、继续封装在线程类中,直接调用该实例的方法就行。
public class ReadThread implements Runnable{
public Thread t;
private String threadName;
boolean suspended=false;
public ReadThread(String threadName){
this.threadName=threadName;
System.out.println("Creating " + threadName );
}
public void run() {
for(int i = 10; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// Let the thread sleep for a while.
try {
Thread.sleep(300);
synchronized(this) {
while(suspended) {
wait();
}
}
} catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
e.printStackTrace();
}
System.out.println("Thread " + threadName + " exiting.");
}
}
/**
* 开始
*/
public void start(){
System.out.println("Starting " + threadName );
if(t==null){
t=new Thread(this, threadName);
t.start();
}
}
/**
* 暂停
*/
void suspend(){
suspended = true;
}
/**
* 继续
*/
synchronized void resume(){
suspended = false;
notify();
}
}
上一篇:Java同学找工作最懵圈的问题:到底啥是分布式系统开发经验?(推荐)
栏 目:JAVA代码
下一篇:Java for-each循环使用难题2例(高级使用方法)
本文标题:详解java线程的开始、暂停、继续
本文地址:http://www.codeinn.net/misctech/154736.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




