[未完成][Mooc]关于线程的总结
进程和线程.
Eclipse,QQ都是进程.是程序或者任务的执行过程,是动态性.
持有资源(共享内存,共享文件)和线程. 这个资源就是内存.
每个程序在运行的时候都会分配一些内存.
Eclipse中的源代码文件编辑,源代码编译,语法校验.QQ中的文字聊天,收发文件都是对应的线程
进程是一个班级,班中每个学生都是一个线程.班中的学生中使用班级中的公共资源(座椅,粉笔等)
线程之间的通信(交互)有 互斥和同步.
类比到班级中就是,同一个班级中的学生进行的竞争和合作(同步).学习资料的竞争,班级活动中的合作.
java.lang 中的class Thread类和interface中的Runnable接口.
这两个中有一个共同的方法run()方法.
线程的创建:
Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target,String name)
线程的方法:
void start() 启动线程
static void sleep(long millis); 线程休眠
static void sleep(long millis,int nanos);线程休眠
void join() 使其他线程等待当前线程终止
void join(long millis);使其他线程等待当前线程终止
void join(long millis,int nanos);使其他线程等待当前线程终止
static void yield() 当前运行线程释放处理器资源
获取线程引用
static Thread currentThread() 返回当前运行的线程的引用
光说不练嘴把式!
代码演绎隋唐演义:
总共三个对象.
隋朝军队(军队:ArmyRunnable)和农民军队(英雄人物:KeyPersonThread).对应两个不同的线程.
还有一个舞台(Stage).
主要演员就是MrThread 和 Ms Runnable
Actor.java
public class Actor extends Thread{
public void run(){
System.out.println(getName()+" 是一个演员!");
int count = 0;//用来记录线程出现过多少次.
boolean keepRunning = true;//作为线程运行的一个flag.
while(keepRunning){
System.out.println(getName()+" 登台演出"+(++count)+"次");
if(count ==100){
keepRunning = false;
}
if(count%10==0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(getName()+" 的演出结束了!");
}
public static void main(String[] args) {
Thread actor = new Actor();
actor.setName("Mr Thread");
actor.start();
Thread actressThread = new Thread(new Actress(),"Ms.Runnable");
// Thread(Runnable target,String name)
actressThread.start();
}
}
class Actress implements Runnable{
@Override
public void run() {
//实现Runnable接口的话是要用Thread.currentThread().getName()来获取当前线程的名字.
System.out.println(Thread.currentThread().getName()+" 是一个演员!");
int count = 0;//用来记录线程出现过多少次.
boolean keepRunning = true;//作为线程运行的一个flag.
while(keepRunning){
System.out.println(Thread.currentThread().getName()+" 登台演出"+(++count)+"次");
if(count ==100){
keepRunning = false;
}
if(count%10==0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName()+" 的演出结束了!");
}
}
隋唐演义实战开发----军队.
隋唐演义实战开发----关键人物
如何停止线程:
stop
正确的停止java中的线程.
java中自带了一个stop方法
stop是java1.0中自带的停止线程的方式,但是随着时间的发展,人们发现他越来越多的缺点,最重要的就是使得我们的线程戛然而止.
我们甚至都不知道我们的线程完成了哪些工作,哪些工作还没有做.我们都没有机会去做一些清理的工作.
一个业务步骤(以一个for循环举例)都没有完成就停止(for循环中都没有到达一个i的结束条件时就结束)
连java官方也把stop()方法标注层了deprecate.
stop()方法不是一个正确的方法,不应该用它停止我们的线程.
停止线程的正确方法:
正确的方法---设置正确的旗标
如何停止线程,使用退出的标志.
上面用的stop()方法是一个业务步骤(以一个for循环举例)都没有完成就停止(for循环中都没有到达一个i的结束条件时就结束).
我们想要的是结束这个线程最起码完成一个业务(for循环中循环到的i值不能到任意就停止,而是至少要到达i该结束循环条件的时候)
停止线程广为流传的错误方法---interrupt()
interrupt()方法也不是用来停止线程的,初衷并不是停止线程.
这个地方有三个方法要注意区别:
void interrupt() 中断线程
static boolean interrupted() 测试当前线程是否已经中断
boolean isInterrupted() 测试线程是否已经中断。
interrupt()方法其实质还是用的退出"旗标"的方式.
当线程进入阻塞状态(sleep)的时候此时再被调用interrupt()方法的时候.
此时会产生两个结果,一是中断状态被清除,Thread线程的isInterrupted()方法就不能返回一个正确的是否被中断的状态.
代码中的while(!isInterrupted())就不能正确的退出了.第二个是sleep()会收到一个InterruptedException();
所以说Interrupted()不是一个正确的退出线程的方式,还是推荐用"退出旗标"的方式,不过修改代码还是可以正确的退出线程的.
(老师这个地方留作作业了)
WrongWayStopThread.java
=========未完待续===========
[未完成][Mooc]关于线程的总结的更多相关文章
- [未完成][Mooc]关于IO总结
整个课程的大纲:1.编码问题.2.File类的使用3.RandomAccessFile的使用4.字节流的使用.5.字符流的使用.6.对象的序列化和反序列化. 视频1:文件的编码Eclipse的一大特点 ...
- [未完成][Mooc]关于Linxu的总结(一)
视频1:Linux之前有个Minix(这个是一个教授用来教学用的)开源的,不是编译过的,不能通过QQ.exe找到其源码.后来Linus这个家伙搞了一个Linux.服务器领域超过百分之八十.linux是 ...
- ConcurrentDictionary线程不安全么,你难道没疑惑,你难道弄懂了么?
前言 事情不太多时,会时不时去看项目中同事写的代码可以作个参考或者学习,个人觉得只有这样才能走的更远,抱着一副老子天下第一的态度最终只能是井底之蛙.前两篇写到关于断点传续的文章,还有一篇还未写出,后续 ...
- 高并发WCF配置
在使用WCF做服务接口时,TCP模式肯定比Http效率高,Binary/MTOM格式的绑定也会Text格式的绑定高效. 两个endpoint,一个用来调试:ms-mex的binding是用来方便WCF ...
- python爬虫抓网页的总结
python爬虫抓网页的总结 更多 python 爬虫 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自 ...
- Quartz的misfire特性
Quartz的misfire特性 只有一个线程.多个job 第一个job产生misfire(executeTime>Interval) 且是repeatForever 那么只会运行第一个job, ...
- 爬虫总结_python
import sqlite3 Python 的一个非常大的优点是很容易写很容易跑起来,缺点就是很多不那么著名的(甚至一些著名的)程序和库都不像 C 和 C++ 那边那样专业.可靠(当然这也有动态类型 ...
- python爬虫抓站的一些技巧总结
使用python爬虫抓站的一些技巧总结:进阶篇 一.gzip/deflate支持现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页为例,未压缩版本247K,压缩了以后45 ...
- 使用python爬虫抓站的一些技巧总结:进阶篇
Reference:http://python.jobbole.com/82000/ 一.gzip/deflate支持 现在的网页普遍支持gzip压缩,这往往可以解决大量传输时间,以VeryCD的主页 ...
随机推荐
- Hibernate初认识以及HelloWorld
一.Hibernate初认识 1. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 2.对 ...
- 用C语言实现ipv4地址字符串是否合法
用程序实现ipv4地址字符串是否合法,主要考察的是C字符串的操作. 搜索了下,网上没有特别好的实现,自己实现了下,见笑于大家,请指正. #include <stdio.h> #includ ...
- POJ 1611 The Suspects (并查集)
The Suspects 题目链接: http://acm.hust.edu.cn/vjudge/contest/123393#problem/B Description 严重急性呼吸系统综合症( S ...
- HDU 5676 ztr loves lucky numbers (模拟)
ztr loves lucky numbers 题目链接: http://acm.hust.edu.cn/vjudge/contest/121332#problem/I Description ztr ...
- lib 和 dll 的区别、生成以及使用详解
首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方式. 静态库:在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可 ...
- 根据powerdesigner的OO模型生成C#代码
2007-05-15 08:34:11| 分类: 转贴部分 | 标签:学习帖子 |字号 订阅 习惯了用Powerdesigner设计数据库模型,XDE设计类图.因此我一般的设计方法是用PD做分析模 ...
- C#不错的扩展工具类
FSLibExtension.NET https://github.com/iccfish/FSLib.Extension WebEssentials2013 https://github.com/i ...
- 利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)
转自:http://www.himigame.com/iphone-cocos2dx/1354.html 首先说明一个问题: 为什么要在线更新资源和脚本文件!? 对于此问题,那要说的太多了,简单概括, ...
- 2014广州Java岗位面试汇总
本文记录了最近一些朋友提供的面试经历,真实数据,仅供广州求职的朋友参考.为行文方便,一律用主语”我“进行.部分词语可能造成读者不良反应,敬请留意. 1 广州沣首信息科技有限公司 公司所在区域相对较偏 ...
- JSP/ Servlet常见的中文乱码原因
在开发中,我们经常遇到中文乱码的问题,比方: &浏览器中看到的 Jsp/Servlet 页面中的汉字成了 '?' ? &浏览器中看到的 Servlet 页面中的汉字都成了乱码 &a ...