Android Java 并发程序系列----你应该知道的线程一
来源:互联网 发布:陕师大网络远程教育 编辑:程序博客网 时间:2024/06/05 11:14
1.基本概念:(个人理解不代表真理)
①进程是线程的容器
②程序是指令,数据,及其组织形式的描述
③进程是程序的实体
④线程是具体任务的执行单元
2.线程的基本操作
①开启一个线程
new Thread().start();//不要 new Thead().run(); 这样是不会开启一个线程的 只是执行一个普通方法
②再开启一个线程:
我们知道线程是执行单元,那么具体任务我们一般是用 Runnable来表示的 ;我们一个任务可以多个线程执行;
Runnable task = new Runnable() { @Override public void run() { //任务具体 } }; new Thread(task).start(); new Thread(task).start(); new Thread(task).start();
③停止一个线程
stop():这是Java提供给我们的方法,虽然是官方提供,但是官方并不推荐我们使用;
这里我们简单说下为什么:stop是强制停止一个线程,并不管任何事情,现在A线程对资源P进行读操作,B线程对资源P进行写操作,如果B写入一半的时候,被stop,而A又去对P进行读取,那么这个时候读取到的数据肯定就是一个坏掉的数据,并且这种错误是很难发现的。
下面给出代码重现这个情景:
static final User user = new User(); public static void main(String[] args) { new Thread(read).start(); while (true) { Thread thread = new Thread(write); thread.start(); try { Thread.sleep(150); } catch (InterruptedException e) { e.printStackTrace(); } thread.stop(); } }static Runnable write = new Runnable() { @Override public void run() { synchronized (user) { //任务具体 long currentTimeMillis = System.currentTimeMillis() / 1000; user.name = String.valueOf(currentTimeMillis); try { Thread.sleep(100);//为了使错误率提高点 } catch (InterruptedException e) { e.printStackTrace(); } user.twoName = String.valueOf(currentTimeMillis); } Thread.yield(); } }; static Runnable read = new Runnable() { @Override public void run() { //任务具体 while (true) { if (!user.name.equals(user.twoName)) { System.out.println(user.toString()); } Thread.yield(); } } }; static class User { String name = ""; String twoName = ""; @Override public String toString() { return "User{" + "name='" + name + '\'' + ", twoName='" + twoName + '\'' + '}'; } }
④ 再停止一个线程
我们正确停止一个线程的方法应该是有一个标记位,在线程结束的时候通过标记位结束线程,具体请看下面代码,这样才能保证线程结束会在可控制范围,而不会直接就中断出去了。特别值得注意的就是:如果一个线程抛出了一个异常(当然是你已经捕获的异常,要不然直接crash就不考虑了),会重置标记位,那么这个时候你应该在捕获到异常的时候再次调用interrupt()方法。
Runnable tastk = new Runnable() { @Override public void run() { //任务具体 while (true) { if (Thread.currentThread().isInterrupted()) { System.out.println("线程执行中。。。"); break; } Thread.yield(); } System.out.println("线程即将结束"); } }; Thread thread1 = new Thread(tastk); thread1.start(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } thread1.interrupt();
今天就先说到这里吧,关于线程想要说的有点多,我还需要整理整理。。。只能慢慢来了,一点点来了,说多了,估计你也不爱看。。。嘿嘿,恩,这才是最主要的。。。
0 0
- Android Java 并发程序系列----你应该知道的线程一
- Android Java 并发程序系列----你应该知道的线程二
- Android Java 并发程序系列----你应该知道的多线程概念
- Android Java 并发程序系列
- Android开发,你应该知道的
- 你所应该知道的Android设计
- Android开发,你应该知道的
- Android Fragment 你应该知道的一切
- 【Android】Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- Android Fragment 你应该知道的一切
- hiho1515分数调查
- java_入门基础学习(四)
- KNN算法调用包
- 有一行电文,已按下面规律译成密码:简单译码问题
- API 设计更精简
- Android Java 并发程序系列----你应该知道的线程一
- Java异常排查之NoClassDefFoundError
- Mat中实际数据是如何保存的
- SSD 里的 atrous
- 前端发开插件之toastr
- 南阳OJ 题目64:小学生算术
- 树中两结点的最低公共祖先(C++实现)
- 阿里聚安全Webview安全攻防
- 二叉树的前序遍历