详解 java 线程的开始暂停继续
这里有新鲜出炉的 Java 函数式编程, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
本文将介绍通过线程读取文件内容, 并且可以控制线程的开始暂停继续, 来控制读文件具有一定的参考作用, 下面跟着小编一起来看下吧
Android 项目中的一个需求: 通过线程读取文件内容, 并且可以控制线程的开始暂停继续, 来控制读文件在此记录下
直接在主线程中, 通过 waitnotifynotifyAll 去控制读文件的线程(子线程), 报错: java.lang.IllegalMonitorStateException
需要注意的几个问题:
任何一个时刻, 对象的控制权 (monitor) 只能被一个线程拥有
无论是执行对象的 waitnotify 还是 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();
- }
- }
来源: http://www.phperz.com/article/18/0211/358985.html